0

以下は、 1/2^n を 0 になるまで合計する関数です。else ステートメントが必要かどうか、およびコンパイル エラーが発生しないように括弧を配置する方法を誰かに教えてもらえますか?

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

3 に答える 3

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))))
于 2013-09-03T15:14:05.707 に答える
1

いくつかの構文エラー (ほとんどの場合、括弧の誤り) があり、ifフォームが使用されていませんelse誤解しないでください。「else」部分があります。それが機能するために明示的に記述してはならないだけです。. これがあなたが目指していたものだと思います:else

(define (zeno n)
  (if (= n 0)
      0
      (+ (/ 1 (expt 2 n))
         (zeno (- n 1)))))
于 2013-09-03T14:46:02.680 に答える