Я не углублялся в этот алгоритм, но сомневаюсь, что хвостовая рекурсия возможна (полезно). Вам нужно пройтись по дереву, а затем создать резервную копию, чтобы восстановить узлы на пути к корню. Для этого требуется стек, следовательно, нет recur
.
Если вы хотите, вы можете управлять своим собственным «стеком» в куче, сохраняя список родительских узлов и вручную возвращая их обратно в корень. Тогда вы можете использовать recur
и избежать переполнения стека, но вы не будете использовать меньше памяти (вероятно, больше, на самом деле). Так что это только полезный трюк, если у вас есть деревья с 2 ^ 1000 элементов в них (и я, скорее, сомневаюсь, что вы делаете).
Редактировать
только что заметил ваш вопрос по поводу
(if (empty? key)
(...empty...)
(let [[k & ks] key]
(...more...)))
Вы можете переписать это более просто и кратко, как:
(if-let [[k & ks] (seq key)]
(...more...)
(...empty...))