[英]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)
這樣的表達式時,通常表示
“使用參數
bar
和baz
調用函數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.