Мне нужно сделать циклический метод, который принимает в качестве аргумента какое-то имя метода и сколько раз он будет зацикливаться.
Проблема в том, что я не могу использовать какие-либо мутации (def, let и т. д.), а также стандартные функции clojure, кроме if, inc, dec, println, +, -, = и т. д.
Только с SEQ и рекурсией!!!
Мой пример:
;; F = some function name, for example, inc, dec, println and etc.
(defn my-loop [f n]
(if (= n 0)
f
(my-loop f (dec n))))
;; Returns 2, instead of 3, because on next iteration argument F = nil :(
(my-loop (inc 1) 2)
Очевидно, что при вызове рекурсии аргумент F равен NIL, поэтому как я могу вернуть тот же аргумент при вызове рекурсии (без жесткого кода).
Вы ищете (last (take 5 (iterate inc 13)))
?
К сожалению, нет, я не могу использовать last, take, iterate и другие стандартные функции. Я могу использовать эти методы только в том случае, если эти стандартные функции clojure написаны мной (также без стандартных функций)
Поэтому мне нужно написать все стандартные функции clojure самостоятельно, используя только SEQ и рекурсию.
(letfn [(my-loop [f n result]
(if (< n 1) result
(recur f (dec n) (f result))))]
(my-loop inc 2 1))
Большое спасибо, сработало для меня. Мое решение: `(defn my-loop [f n result] (if (< n 1) result (my-loop f (dec n) (f result)))) (my-loop inc 1 2) `
Спасибо за помощь, мое решение:
(defn my-loop [f n result]
(if (< n 1)
result
(my-loop f (dec n) (f result))))
(my-loop inc 2 1)
SEQ, я имею в виду: next(), first(), seq().