使用tailrecursion的列表的方案长度

时间:2014-02-03 16:55:43

标签: scheme tail-recursion

我一直试图使用尾递归的方案找到列表的长度,到目前为止,我有这个

(define num-els2
  (lambda(xs)
    mynum xs 0))

(define mynum
  (lambda (xs empt)
    (if (empty? xs)
        empt
        (mynum (rest xs) (+ empt 1)))))

但它一直给我0.我认为由于某种原因它不会增加我的返回值。那么我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

num-els2程序中的括号有问题,没什么大不了的。基本上,您没有正确调用mynum帮助程序,并且该过程始终返回0,因为这是正文中的最后一个表达式。在这里,这应该解决它:

(define num-els2
  (lambda(xs)
    (mynum xs 0))) ; notice the opening bracket in this line

答案 1 :(得分:1)

Scheme为此提供了一个名为let的文件:

(define (list-length list)
  (let loop ((list list)
             (length 0))
    (if (null? list)
        length
        (loop (cdr list) (+ length 1)))))

自R2RS(1985)以来,它是该标准的一部分。之前它被称为“迭代”。

指定的let规范是Iterations部分的一部分。