方案列表计数功能

时间:2012-10-22 14:43:19

标签: list recursion count scheme

我正在尝试编写一个Count函数来计算列表中的所有项目,但与可用的长度函数不同的是,内部列表也会计数,因此countAll'(a(ab))将返回3而不是2。

第一次检查是针对空列表,第二次检查是否检查列表的头部当前是否是列表本身,然后应该将该列表的长度添加到总计并调用下一个递归调用,如果它不是,它应该简单地跳到第三部分,它将在总数中加一,并递归调用函数。

我遇到了语法错误,我对我的方法不确定。我是以正确的方式来做这件事的吗?有没有更好/更简单的方法来做到这一点?

(define countAll 
  (lambda (list)

    (if (null? list)
        0

        ((if (list? (car list)
                    (+ length (car list)
                       (countAll (cdr list))))))

        (+ 1
           (countAll (cdr list))))))     
  (+ 1
   (countAll(cdr list)
  )))))

3 个答案:

答案 0 :(得分:2)

你把你的括号搞得一团糟。我强烈建议使用 cond 重写此内容,如

(cond
  ((null? lst) 0)
  ((list? (car lst)) (???))
  (else (???)))

这样可以更容易地看到你在做什么,而且更不容易弄乱你的括号。除了在最简单的情况下,嵌套ifs确实是要避免的。

您的方法几乎正确,但您错过了一些东西。您已经对(list? (car lst))求值为true时发生的事情进行了假设。你能想到它是什么吗?如果你考虑得足够困难,你会发现你不能在这里使用长度功能。

答案 1 :(得分:1)

这种问题的解决方案遵循一个众所周知的结构,如果您愿意,可以使用一个配方来遍历列表。这看起来像是家庭作业,所以我会帮助你了解一般的想法,然后继续填写空白:

(define (countAll lst)
  (cond ((null? lst)               ; if the list is empty.
         <???>)                    ; then it doesn't have any elements
        ((not (list? (car lst)))   ; if the first element in the list is not a list
         (<???> (countAll <???>))) ; add one and advance the recursion over the `cdr`
        (else                      ; otherwise
         (+ (countAll <???>)       ; add the result of the recursion over the `car`
            (countAll <???>)))))   ; with the result of the recursion over the `cdr`

如果您需要更多帮助,了解如何为处理列表列表的此类问题构建解决方案,我建议您查看The Little SchemerHow to Design Programs,这两本书都会教你如何理解递归过程。

答案 2 :(得分:0)

如果你想计算嵌套列表的元素,可以使用深度递归函数,因为有人在这里回答。或者我做的是使用racket函数(flatten)使嵌套列表变平,然后在1级列表上使用递归,如下面的代码所示

  (define (howMany ls)
  (if (null? ls)
  0
  (+ 1 (howMany (cdr ( flatten ls  )))))) ; flat the nested list and deal with it as a level 1 list.