所以我有这两个功能单独工作。我正在尝试编写一个函数来完成这两个功能,但我一直遇到汽车错误。关于解决这个问题的最佳方法的任何指导?
(define (countNumbers lst)
(cond
((null? lst) 0)
((number? (car lst))(+ 1 (countNumbers (cdr lst))))
(else (countNumbers (cdr lst)))))
(define (flatten x)
(cond ((null? x) '())
((pair? x) (append (flatten (car x)) (flatten (cdr x))))
(else (list x))))
我尝试了类似这样的东西,对于一般的函数式编程来说是一个新手,所以我仍然试图把它包裹起来,它说问题是在数字之后?(car lst)
(define (flatten lst)
(cond ((null? lst) '())
((pair? lst) (append (flatten (car lst)) (flatten (cdr lst))))
(else (list(cond
((null? lst) 0)
((number? (car lst))(+ 1 (flatten (cdr lst))))
(else (flatten (cdr lst))))))))
答案 0 :(得分:0)
正如我在评论中所提到的,我认为将所有内容都放在一个功能中并不是一个好主意。无论如何,你是在正确的轨道上,但我们必须记住,如果我们要返回数字作为最终结果,那么我们的基本情况应该反映这一点并且还返回一个数字(不是空列表),组合步骤应该添加数字,而不是append
。这就是我的意思:
(define (count-flatten lst)
(cond ((null? lst) 0)
((pair? lst)
(+ (count-flatten (car lst))
(count-flatten (cdr lst))))
((number? lst) 1)
(else 0)))
但我宁愿这样做:
(define (count-flatten lst)
(countNumbers (flatten lst)))
我们甚至可以只使用内置程序编写惯用解决方案,检查解释器的文档,但在Racket中我们可以这样做:
(define (count-flatten lst)
(count number? (flatten lst)))
无论如何,它按预期工作:
(count-flatten '(1 x (x 2) x (3 (4 x (5) 6) 7)))
=> 7