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知道计数?第一次使用 a 调用此过程时list,它将依次使用两个参数定义另一个过程,我得到了很多。但它怎么知道那alist items? 它还没有到达第 6 行,作为参数items传递给where 。不知何故,尽管它已经知道这一点并且能够进行计算。感谢您对澄清这一点的任何帮助!length-itera

4

1 回答 1

4

函数中有两部分length

  1. 内部函数的定义length-iter
  2. 调用内部函数length-iter

在调用中,即第 6 行,您原始items列表作为参数传递给内部函数。这是调用内部函数的地方。以前,您只是定义函数,而不是调用它:

(length-iter items 0)

因此,items将被绑定到a和 。您可以将内部函数视为一个单独的函数:0count

(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 回答