Я бы не ответил на что-то, похожее на домашнюю работу, но «идиоматический» комментарий просто попросил показать, что это действительно не так далеко.Во-первых, прямой перевод:
(define (sum-fibonacci-values)
(define n 4000000)
(define i2 1)
(define i1 1)
(define fibo 0)
(define temp 1)
(let loop ()
(when (< i2 n)
(set! temp (+ i1 i2))
(set! i1 i2)
(set! i2 temp)
(when (zero? (modulo i2 2)) (set! fibo (+ fibo i2)))
(loop)))
(write fibo))
Во-вторых, сделайте его «идиоматическим», удалив избыточные мутации, и вместо этого просто связывайте новые значения и используя хвост-рекурсивный цикл.Обратите внимание, что этот код все еще находится в прямой корреляции с оригиналом:
(define (sum-fibonacci-values)
(define n 4000000)
(let loop ([i2 1] [i1 1] [fibo 0] [temp 1])
(if (< i2 n)
(let* ([temp (+ i1 i2)]
[i1 i2]
[i2 temp]
[fibo (if (zero? (modulo i2 2)) (+ fibo i2) fibo)])
(loop i2 i1 fibo temp))
fibo)))
Наконец, теперь, когда код более понятен, вы можете видеть, что есть некоторые избыточности.Вот очищенная версия:
(define (sum-fibonacci-values)
(define n 4000000)
(let loop ([i2 1] [i1 1] [fibo 0])
(if (< i2 n)
(let ([i3 (+ i1 i2)])
(loop i3 i2 (if (zero? (modulo i3 2)) (+ fibo i3) fibo)))
fibo)))
Обратите внимание, что такую же очистку можно выполнить с кодом Java.(Но это действительно оставлено читателю в качестве упражнения ...)