以下は、 1/2^n を 0 になるまで合計する関数です。else ステートメントが必要かどうか、およびコンパイル エラーが発生しないように括弧を配置する方法を誰かに教えてもらえますか?
(define (zeno n)
(if (= n 0)
(+ 0)
(else
((+ (/ 1 (expt 2 n )))
((zeno(- n 1)))))))
以下は、 1/2^n を 0 になるまで合計する関数です。else ステートメントが必要かどうか、およびコンパイル エラーが発生しないように括弧を配置する方法を誰かに教えてもらえますか?
(define (zeno n)
(if (= n 0)
(+ 0)
(else
((+ (/ 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 41 に加えて、SRFI 26もロードする必要があります。)
さらに完全に異なるアプローチ: クローズド フォーム ソリューションを使用するだけです。(ありがとう、WorBlux。)
(define (zeno n)
(- 1 (/ (expt 2 n))))
いくつかの構文エラー (ほとんどの場合、括弧の誤り) があり、if
フォームが使用されていません。else
誤解しないでください。「else」部分があります。それが機能するために明示的に記述してはならないだけです。. これがあなたが目指していたものだと思います:else
(define (zeno n)
(if (= n 0)
0
(+ (/ 1 (expt 2 n))
(zeno (- n 1)))))