簡體   English   中英

方案:遞歸zeno函數

[英]Scheme: recursive zeno function

以下是一個將1/2 ^ n加到0的函數。 有人可以告訴我是否需要else語句,以及如何排列括號以確保沒有編譯錯誤嗎?

(define (zeno n)
  (if (= n 0)
      (+ 0)
      (else
        ((+ (/ 1 (expt 2 n )))
         ((zeno(- n 1)))))))

我戴上帽子,喝茶,上班沒時間做。 你知道現在幾點了。

[不帶密碼審查帽]

首先,如果您正確縮進了代碼,它將顯示為

(define (zeno n)
    (if (= n 0)
        (+ 0)
        (else
         ((+ (/ 1 (expt 2 n)))
          ((zeno (- n 1)))))))

if in Scheme不像C語言一樣的if / then / else構造。 實際上是三元運算符 換句話說,在這種情況下, else毫無意義。

(define (zeno n)
    (if (= n 0)
        (+ 0)
        ((+ (/ 1 (expt 2 n)))
         ((zeno (- n 1)))))))

您不需要使用+來返回數字; 數字是自我評估的。

(define (zeno n)
    (if (= n 0)
        0
        ((+ (/ 1 (expt 2 n)))
         ((zeno (- n 1)))))))

當您具有(foo bar baz)這樣的表達式時,通常表示

“使用參數barbaz調用函數foo

您不能隨便添加多余的括號。 這些改變了表達的含義。 例如, ((foo) (bar baz))意思是

“不帶參數調用函數foo ,並以帶參數baz調用bar的結果來調用其結果”

換一種說法,

...
((+ (/ 1 (expt 2 n)))
 ((zeno (- n 1))))))

您在說什么,幾乎可以肯定不是在這里,這是

“調用函數(+ (/ 1 (expt 2 n)))的結果是調用不帶參數的參數(- n 1)調用zeno的結果。”

你似乎的意思是

“將調用zeno的結果加1除以2^n ,且n小於n

這意味着您應該說的是

(define (zeno n)
    (if (= n 0)
        0
        (+ (/ 1 (expt 2 n))
           (zeno (- n 1)))))

你有幾個語法錯誤(錯誤的括號內,多),並且if形式不使用else -不要誤會我的意思,它確實有一個“其他”的一部分,它只是你不能明確寫入else的它起作用。 我相信這就是您的目標:

(define (zeno n)
  (if (= n 0)
      0
      (+ (/ 1 (expt 2 n))
         (zeno (- n 1)))))

對於完全不同的方法,這使用顯式的do循環進行求和。 它避免使用expt (通過設計)。

(define (zeno n)
  (do ((n n (- n 1))
       (sum 0 (+ sum frac))
       (frac 1/2 (/ frac 2)))
      ((zero? n) sum)))

將其寫入等效的名為let形式時,它可能會或可能不可讀:

(define (zeno n)
  (let loop ((n n)
             (sum 0)
             (frac 1/2))
    (if (zero? n)
        sum
        (loop (- n 1) (+ sum frac) (/ frac 2)))))

對於更完全不同的方法,可以使用SRFI 41流:

(define zeno
  (let ((frac-stream (stream-iterate (cut / <> 2) 1/2)))
    (lambda (n)
      (stream-fold + 0 (stream-take n frac-stream)))))

(以上代碼段也需要SRFI 26被加載,除了SRFI 41)


甚至更完全不同的方法:僅使用封閉形式的解決方案! (謝謝,WorBlux。)

(define (zeno n)
  (- 1 (/ (expt 2 n))))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM