борьба с f # - борьба в царстве деревьев - в частности, подсчет количества узлов. Это представляет реальный интерес, так как программа, которую я хотел бы в конечном итоге закодировать в F #, касается многоуровневых деревьев, к сожалению, она дошла до неприятного начала - надеюсь, вы, возможно, сможете помочь!Подсчет узлов в дереве
Задача 61 из серии 99 f #, просит подсчитать листья двоичного дерева. Решение (ниже) подсчитывает узлы, но моя проблема не понимая
как двойная рекурсия работает петлю влево (прикольная LACC -> петля правый ..)
, что
cont (branchF x lacc racc)
, мои Создавалось впечатление, что продолжение было функцией «а», но это занимает всего два параметра ...loop t id
идентификатора единицы типа - я не вижу, как это подразумевается
в основном не понимает этого, или порядок, в котором он протекает через дерево (отладка & шаг за шагом не доказывает, что это полезно). Если есть более простые примеры, рекомендации для предварительного чтения и т. Д., Тогда, пожалуйста, направляйте меня к ним.
Большое спасибо за любую помощь, код решение о котором идет речь ниже:
Приветствия
тд
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
Я не знаю, что я думал, когда писал это решение, но Ли был прав, а «if» в advLeaves ничего не делает. Решение должно быть разрешено командой ordLeaves tree = tree |> foldTree (fun _ lc rc -> 1 + lc + rc) 0. Если вы хотите узнать больше о сложениях и продолжениях. Я рекомендую сериал «Катаморфизм» Брайана Макнамары здесь [ссылка] (http://lorgonblog.wordpress.com/2008/04/05/catamorphisms-part-one/). Вот где я получил функцию fodlTree. –
Hi Cesar, просто хотел сказать спасибо за публикацию серии 99 проблем - действительно отличный инструмент для обучения - в частности, множество решений. Ура! – dusiod
Увидев, что никто не ответил на ваш вопрос об идентификаторе, «id» является оператором идентификации. Вы можете заменить id (fun x -> x) на тот же аффект. См. Здесь: http://msdn.microsoft.com/en-us/library/ee353607.aspx Кроме того, в этом коде есть что-то ужасное: я создал простое дерево узлов, и мне сказали, что размер 32! Я опубликую правильную реализацию (которая у меня работает), когда я выясню все нюансы. –