如何在方案语言中考虑点后面的点和元素来找到一对长度?

时间:2015-10-11 02:38:45

标签: scheme lisp racket

我找到了一对完整的长度,但我找不到一对长度,不包括点和点后面的元素。任何建议表示赞赏。

(define (paircount seq)
  (cond ((null? seq) 0)
    ((not (pair? seq)) 1)
    (else (+ (paircount (car seq))
             (paircount (cdr seq))))))

         input: (paircount '(a b c d . e))
         output : 5
         desired output : 4 (considering only a b c d but not 'e')

2 个答案:

答案 0 :(得分:1)

很简单,只需将((not (pair? seq)) 1)更改为((not (pair? seq)) 0)

答案 1 :(得分:-2)

正常方案列表采用

形式
(a . b . c . d . e . null)

列表中的每个项目都是一对,其中包含您的值作为第一个元素,另一个对作为第二个元素,但最后一对包含null。

在您的情况下,最后一对的第二个元素是既不是一对也不是null的值。听起来你所要做的就是排除这个项目。

(define (paircount seq)
  (cond ((null? seq) 0)
        ((pair? seq) (+ 1 (paircount (cdr seq))))
        ; The else case excludes the second element
        ; of the final pair
        (else 0)))

这里有一点奖励。如上所述,您的函数不是尾递归。对于列表中的每个元素,将有一个单独的堆栈帧,因此对于很长的列表,您可能会耗尽内存。请尝试这种方式:

(define (paircount seq)
  (define (foo s accum)
    (cond ((null? s) accum)
          ((pair? s) (foo (cdr s) (+ 1 accum)))
          (else accum)))
  (foo seq 0))

注意您的版本如何首先调用自身,然后添加结果。这个版本首先添加,然后用总和调用foo。

最后,您是否打算计算列表列表的元素数量?如果您不知道列表嵌套的深度,那么您无法区分应该被解释为一对列表的一对应该被解释为恰好是一对的元素。