2011-09-03 53 views
1

我正在學習Scheme,並且我已經閱讀了基礎知識,但我仍然無法確定如何將Java類映射到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); 
    } 
} 
+0

SO不是代碼生成機器。 –

+0

我不是要求代碼生成,我要求代碼翻譯。我可以編寫自己的代碼,但從來沒有寫過任何類似於我在Scheme中發佈的內容,並且希望能夠幫助我們瞭解應該如何實現。 – Tsundoku

+0

我懷疑有可能對Scheme進行直接的「有狀態」映射,但這個程序的慣用Scheme實現看起來非常不同。我的計劃技能很生疏,所以恐怕我無法提供答案,但要警告。 –

回答

9

,我也不會回答的東西,看起來很像功課,但「習慣「評論只是乞求一個示範,它真的不是那麼遠。首先,直接翻譯過來:

(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代碼進行相同的清理。 (但這真的留給讀者練習......)

+0

您的答案准確地符合Luis Armando將Java映射到Scheme的請求,並希望這對他學習Scheme很有幫助。不過,我認爲值得指出的是,考慮到同樣的任務(總結前n個斐波那契數字,看起來),並且沒有開始的Java實現,所得到的Scheme代碼可能會有所不同,這正是我嘗試的用我的「慣用」評論來製作。我承認這可能超出了路易斯阿曼多的要求。 –

+0

我知道它看起來是作業問題,但不是我可以向你保證,我只是想要一個需要涉及一些有趣思想的例子,而我想到的第一件事就是幾個月前我寫的這段代碼。謝謝你,這真的幫助我瞭解如何使用Scheme =) – Tsundoku

相關問題