2

スキームで関数を引数として渡す方法を理解しようとしていますが、チュートリアルを理解するのに苦労しています。これが私がやろうとしていることです:

(define (addone n)
(+ n 1))
(define (for-n start stop fn)
(if (< start stop)
    (list)
    (cons (fn start) (for-n (+ start 1) stop fn))))

基本的に、start、start+1、... start+stop の fn の値をリストで返す関数が必要です。

したがって、(for-n 1 5 (addone 0)) の期待される出力は (1 2 3 4 5) になります。ここでは非常に基本的な概念がいくつか欠けていると思います。なぜなら、インタープリターで関数を正しく呼び出しているようにも見えず、fn を通常のパラメーターではなく関数として解釈するようにスキームに指示する方法を把握していないからです。 .

私はそれを理解しました(ただし、試行錯誤を繰り返しましたが)、何をしたかわかりませんが、少なくとも機能します!

 (define (function x)
    x)
(define (for-n start stop fn)
  (if (> start stop)
    (list)
    (cons (fn start) (for-n (+ start 1) stop fn)))))
4

2 に答える 2

1

最初のバージョンの何が問題だったのかを知るためのフィードバック:

  • リストを構築する再帰の基本ケースは、通常、通常は返されますが、返さ'()れません。(list)
  • すでに発見したように、基本ケースの条件が間違っていました: 再帰は、最初に述べ(> start stop)たときではなく、いつ終了しますか?(< start stop)
  • addone手続きを定義する必要はありません.add1
  • 最後に、別のプロシージャを受け取るプロシージャを呼び出すときは、関数を渡すだけです。最初に適用する必要はありません。意図した関数ではなく、値が返されます。私が言いたいのは、これは間違っています:(for-n 1 5 (addone 0))そしてこれは正しいです: (for-n 1 5 addone). 関数を記述(addone 0)すると、値が適用されて返され、1渡そうとしたaddoneのはプロシージャ自体です。

上記のすべての提案を適切に行うと、正しい手順は次のようになります。

(define (for-n start stop fn)
  (if (> start stop)
      '()
      (cons (fn start) (for-n (add1 start) stop fn))))

次のように呼び出します。

(for-n 1 5 add1)
> '(2 3 4 5 6)
于 2012-10-13T22:19:31.430 に答える
1

関数呼び出し(addone 0)は value と同じです1addone( ではなく) 関数自体を渡したい場合は1、かっこで囲まないでください。関数を に(for-n 1 5 addone)渡します。括弧で囲むと、Scheme が呼び出して結果を渡します。addonefor-naddone

于 2012-10-13T21:20:47.283 に答える