我正在尝试编写一个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)
)))))
答案 0 :(得分:2)
(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 Schemer或How 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.