2

私はSchemeを学んでいて、基本を読んだのですが、JavaクラスをSchemeコードに「マップ」する方法がまだわかりません。ここで私を助けてくれる人はいますか?これが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);
    }
}
4

1 に答える 1

10

宿題のように見えるものには答えなかったでしょうが、「慣用的な」コメントは、実際にはそれほど遠くないというデモンストレーションを求めただけです。まず、直訳:

(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コードでも同じクリーンアップを実行できることに注意してください。(しかし、それは本当に読者の練習問題として残されています...)

于 2011-09-03T11:56:22.083 に答える