f# との戦い - 戦いは木の領域にあります - 特にノードの数を数えるためです。これは、私が最終的に F# でコーディングしたいプログラムが多方向ツリーに関係しているため、非常に興味深いものです。
99 f# シリーズの問題 61 では、バイナリ ツリーの葉の数を数えます。解決策(以下に示す)はノードをカウントしますが、私の問題は理解できません
二重再帰がどのように機能するか 左ループ (fun lacc -> 右ループ..)
cont (branchF x lacc racc)
つまり、cont は「abc」関数という印象でしたが、これは 2 つのパラメーターしか取りません...loop t id
ID はユニット型です - これがどのように暗示されているのかわかりません
基本的にこれ、またはツリーを流れる順序を理解していません(デバッグとステップスルーは役に立ちません)。より簡単な例、先読みの推奨事項などがある場合は、それらを教えてください。
ご協力ありがとうございます。問題のソリューション コードは以下のとおりです。
乾杯
td
type 'a Tree = Empty | Branch of 'a * 'a Tree * 'a Tree
let foldTree branchF emptyV t =
let rec loop t cont =
match t with
| Empty ->
cont emptyV
| Branch (x, left, right) ->
loop left (fun lacc ->
loop right (fun racc ->
cont (branchF x lacc racc)))
loop t id
let counLeaves tree =
foldTree (fun abc lc rc ->
if lc + rc = 0 then 1
else 1 + lc + rc) 0 tree
let Tree1 = Branch ('x', Branch ('x', Empty, Empty),Branch ('x', Empty, Branch ('x', Empty, Branch ('x', Empty, Empty))))
let result = counLeaves Tree1