在r5rs计划中实现长度(drracket)

时间:2012-12-03 03:28:41

标签: lisp scheme racket r5rs

是否可以使用car和cdr系列函数实现R5RS方案函数“length”? 如果是这样,有人可以发布实施吗?

谢谢,

2 个答案:

答案 0 :(得分:2)

当然,这很简单。我不是直截了当的回答,因为这看起来像是家庭作业,无论如何写作都是微不足道的。填写空白:

(define (length lst)
  (if <???>              ; if the list is empty
      <???>              ; return 0
      (<???>             ; otherwise add 1 and
       (length <???>)))) ; advance the recursion over the rest of the list

请注意,仅使用cdr。我们对列表的实际内容不感兴趣,因此我们可以忽略car

答案 1 :(得分:1)

ÓscarLópez的回答是正确的。这里有两个实现(再次填充空白)。

第一个是左侧解决方案(与Óscar的解决方案形成鲜明对比,右侧折叠方式):

(define (length lst)
  (let loop ((lst lst)
             (count 0))
    (if <???>                   ; if the list is empty
        <???>                   ; return the count
        (loop <???> <???>))))   ; otherwise bump the count and continue down the list

这具有尾递归的优点,而右折版则不是。

第二个是乌龟和野兔的解决方案,它允许检测循环列表(如果给定循环列表,早期的解决方案将永远运行):

(define (length lst)
  (if (null? lst)
      0
      (let loop ((tortoise lst)
                 (hare (cdr lst))
                 (count 1))
        (cond ((eq? tortoise hare) #f)                   ; found a cycle
              ((null? hare) <???>)                       ; reached end of list
              ((null? (cdr hare)) <???>)                 ; reached end of list too
              (else (loop <???> <???> (+ count 2)))))))  ; bump the count and keep looking