10 3 2 1 使用連續處理樹

2021-06-28 00:10:52 字數 1346 閱讀 4980

10.3.2.1 使用連續處理樹

要把我們以前實現的 sumtree 函式,轉變成使用連續的版本,首先,要給這個函式新增乙個額外的引數(連續);其次,還需要改變函式返回結果的方式,不是簡單地返回值,而是把它作為引數值,給連續進行呼叫。 清單 10.18 是**的最終版本。

清單 10.18 使用連續,計算樹中元素的和 (f# interactive)

> let rec sumtreecont tree cont = 

match tree with 

| leaf(num) -> cont(num) 

| node(left, right) –> 

sumtreecont left (fun leftsum ->   [1]

sumtreecont right (fun rightsum –>    [2]

cont(leftsum + rightsum)));;     [3]

val sumtreecont : inttree -> (int ->'a) –> 'a

修改葉子的分支很容易,因為它以前就是從葉子返回值。第二種情況就重要得多,我們使用的模式相似於前面的 c# 示例。我們呼叫函式計算左子樹元素的的和[1](這是尾遞迴),並把 lambda 函式作為它的第二個引數值。在 lambda 函式的內部,我們對右子樹做類似的事情[2](也是尾遞迴呼叫)。一旦我們有兩個子樹的和,就把它作為引數,呼叫最初得到的連續,(這還是尾遞迴呼叫)。

對於我們剛剛寫的這個函式,還有一件重要的事情,就是它的型別簽名。通常,我們不需要顯式寫出任何型別,f# 會為我們推斷出型別。這個函式把樹作為第乙個引數,連續作為第二引數。現在,連續的型別為 int –>'a,函式的整體結果是 'a;換句話說,整個函式的返回型別與連續的返回型別相同。

前面我們提到過,在**中,所有遞迴呼叫現在都是尾遞迴,所以,我們可以在不平衡樹上嘗試這個函式,在以前的版本中是失敗的:

> sumtreecont imbalancedtree (fun r –> 

printfn "result is: %d" r);; 

result is: 8736 

val it : unit = ()

> sumtreecont imbalancedtree (fun a-> a);;   <-- 從連續中返回和

val it : int = 8736

可以看到,現在的**可以執行非常大的樹,而沒有任何麻煩。第乙個示例,我們直接在連續中列印出結果,連續不返回任何值,所以,表示式的整體結果是 unit;在第二種情況下,我們給它乙個恒等函式(返回值就是引數值的函式)作為連續。恒等函式在 f# 庫中已經有了,所以,我們可以寫 id。 連續返回型別是 int,從呼叫 sumtreecont 返回的值就是樹中所有元素的和。

決策樹 連續值的處理

連續值處理 因為連續屬性的可取值數目不再有限,因此不能像前面處理離散屬性列舉離散屬性取值來對結點進行劃分。因此需要連續屬性離散化,常用的離散化策略是二分法,這個技術也是c4.5中採用的策略。下面來具體介紹下,如何採用二分法對連續屬性離散化 下面舉個具體的例子,來看看到底是怎樣劃分的。給定資料集如下 ...

資料連續化處理

這裡先舉個簡單的例子,很多朋友以前一定寫過類似這樣的例子 求編寫一函式,輸入年月日,求出該日是該年的第幾天.好的,現在大家 會怎麼寫呢?我的第一次 大概是這樣的 intgetday intyear,intmonth,intday 最後在下是否閏年 今天在fy 上看了連續化處理後,感悟頗深.對上面的 ...

使用pandas實現連續資料的離散化處理方式

python實現連續資料的離散化處理主要基於兩個函式,pandas.cut和pandas.qcut,前者根據指定分界點對連續資料進行分箱處理,後者則可以根據指定箱子的數量對連續資料進行等寬分箱處理,所謂等寬指的是每個箱子中的資料量是相同的。下面簡單介紹一下這兩個函式的用法 匯入pandas包 imp...