初学者计划:返回的程序

时间:2012-09-16 19:37:09

标签: recursion lisp scheme tail-recursion

这是我正在阅读的书中的一个例子:

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调用过程,它将依次定义另一个带有两个参数的过程,我得到了那么多。但是,它如何知道alist items?它尚未到达第6行,其中items作为参数length-iter传递给a。不知怎的,虽然它已经知道这个并且能够进行计算。任何帮助澄清这一点是值得赞赏的!

1 个答案:

答案 0 :(得分:4)

length功能分为两部分:

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

    (length-iter items 0)
    

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

    (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所知。