Помогите мне перевести эту Java на Scheme, чтобы все пошло мне в голову - PullRequest
1 голос
/ 03 сентября 2011

Я изучаю Scheme, и я прочитал основы, но я все еще не могу понять, как "сопоставить" класс Java с кодом Scheme. Кто-нибудь из вас может помочь мне здесь? Мне просто нужно, чтобы кто-то показал мне, как это выглядит в Схеме, чтобы понять окончательные детали и понять, что происходит в моей голове:

public class sumFibonacciValues {
    public static void main(String [] args) {
        int n = 4000000;
        long i2 = 1, i1 = 1, Fibo = 0, temp = 1;
        while(i2 < n) {
            temp = i1 + i2;
            i1 = i2;
            i2 = temp;
            if(i2 % 2 == 0)
                Fibo += i2;
        }
        System.out.println(Fibo);
    }
}

1 Ответ

9 голосов
/ 03 сентября 2011

Я бы не ответил на что-то, похожее на домашнюю работу, но «идиоматический» комментарий просто попросил показать, что это действительно не так далеко.Во-первых, прямой перевод:

(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.(Но это действительно оставлено читателю в качестве упражнения ...)

...