1

これは私が読んでいる本の例です:

1    (define (length items)
2     (define (length-iter a count)
3       (if (null? a)
4           count
5           (length-iter (cdr a)(+ 1 count))))
6      (length-iter items 0))

私が理解していないのはlength-iter、カウントについてどのように知ることができるかということです? このプロシージャが で初めて呼び出されるとlist、次に 2 つの引数を持つ別のプロシージャが定義されます。しかし、それが であることをどうやって知るalist itemsでしょうか? まだ 6 行目に達していませんが、引数として にitems渡されます。どういうわけか、それはすでにこれを知っており、計算を行うことができます。これを少し明確にするための助けをいただければ幸いです。length-itera

4

1 に答える 1

4

length関数には 2 つの部分があります。

  1. 内部関数の定義length-iter;
  2. 内部関数の呼び出しlength-iter

呼び出し、つまり 6 行目で、元のリストを引数として内部関数に渡します。これは、内部関数が呼び出される場所です。以前は、関数を呼び出すのではなく、関数を定義するだけでした:items

(length-iter items 0)

したがって、と itemsにバインドされます。内部関数は別の関数と考えることができます。a0count

(define (length-iter a count)
  (if (null? a)
      count
      (length-iter (cdr a)(+ 1 count))))

次に、すべての作業を関数lengthに委譲したかのように関数を考えてください。length-iter

(define (length items)
  (length-iter items 0))

それがあなたの機能で行われていることです。違いは、length-iter関数が だけに知られていることlengthです。

于 2012-09-16T19:39:52.643 に答える