Я хотел попробовать и изучить Lisp, но я очень быстро сдался. Я решил, что попробую еще раз. Я смотрю Проблема 2 в Project Euler - нахождение суммы всех четных чисел Фибоначчи менее 4 миллионов.
Я написал следующий код, который работает, но все виды уродливые. Главным среди них является тот факт, что он настолько медленный - потому что он делает наивную рекурсию все время.
Когда я написал эту программу в Python, я создал список, как я рассчитал, и никогда не пересчитывал числа. Я знаю, что могу сделать это здесь (так или иначе), но это, похоже, не соответствует духу Lisp функционального программирования. Я отказался после № 3, когда я ударил ограничение глубины рекурсии и должен был переписать мой код, чтобы использовать цикл вместо рекурсии.
Итак, я полагаю, мои вопросы:
- Какой "правильный, лишенный способ" решить эту проблему?
- Как вы примириваете рекурсию и понятие "всего лишь подсчета всего" с практическим пределом вычисления всего?
- Любые рекомендации по обучению lisp помимо Little Schemer и Project Euler?
И вот мой код:
(defun fib(i)
(if (= i 1) ;Could rewrite this as a case statement
1
(if (= i 2)
1
(+ (fib (- i 1)) (fib (- i 2))))))
(defun solve(i)
(let ((f (fib i))) ;Store result in local variable
(print f) ;For debugging
(if (< 4000000 f)
0 ;return
(if (= 0 (mod f 2))
(+ f (solve (+ i 1))) ;add number
(solve (+ i 1)))))) ;don't
(print (solve 1))