Я хотел попробовать выучить Лисп, но очень быстро сдался. Я решил попробовать еще раз. Я смотрю на Задача 2 в Project Euler - найти сумму всех четных чисел Фибоначчи до 4 миллионов.
Я написал следующий код, который работает, но все виды безобразны. Главным среди них является тот факт, что это так медленно - потому что он все время делает наивную рекурсию.
Когда я писал эту программу на Python, я строил список по моим подсчетам и никогда не пересчитывал числа. Я знаю, что мог бы сделать это здесь (как-то), но это не соответствует духу функционального программирования. Я сдался после # 3, когда я достиг предела глубины рекурсии и мне пришлось переписать свой код, чтобы использовать цикл вместо рекурсии.
Итак, я полагаю, мои вопросы:
- Что такое «правильный, неумелый способ» решить эту проблему?
- Как вы совмещаете рекурсию и понятие «просто вычислить все» с практическим пределом вычисления всего?
- Есть ли какие-нибудь рекомендации для изучения lisp кроме The 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))