Учитывая дерево, закодированное как набор вложенных списков (например, (+ 2 (+ 2 1) (+ 1 3 2))
), существует ли известный алгоритм в Clojure, который стохастически пересекает дерево, применяя параметрически поставленную функцию в одном узле с равной вероятностью «посадки» на любом узле? Примечание: прогулка заканчивается после преобразования одного узла.стохастический обход дерева в Clojure
Я ожидаю, что алгоритм должен вести себя следующим образом:
(def tree '(1 (1 (1 1 1) 1) 1))
(stochastic-tree-f-app inc tree) => (1 (1 (1 2 1) 1) 1)
(stochastic-tree-f-app inc tree) => (1 (1 (1 1 2) 1) 1)
(stochastic-tree-f-app inc tree) => (2 (1 (1 1 1) 1) 1)
(stochastic-tree-f-app inc tree) => (1 (1 (1 1 1) 1) 2)
(stochastic-tree-f-app dec tree) => (1 (1 (1 1 1) 0) 1)
Так как только вы трансформировали один узел, прогулка закончится, это правильно? – ClojureMostly
@ClojureMostly, да, это правильно –
Решение, которое приходит на ум: 1. Пройдите дерево через bfs или dfs, возвращая количество узлов 2. подайте это число на генератор случайных чисел, подавая результат (между 0 и n) до 3. третьего d/bfs, который пересекает граф число раз, заданное генератором случайных чисел 4. apply f –