在方案中结合计数和展平功能

Combining count and flatten functions in scheme

所以我有这两个功能可以单独使用。我正在尝试编写一个函数来完成这两个功能,但我一直遇到汽车错误。关于解决此问题的最佳方法的任何指导?

(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))))))))

正如我在评论中提到的,我认为将所有内容都集中在一个函数中并不是一个好主意。无论如何,你走在正确的轨道上,但我们必须记住,如果我们要 return a number 作为最终结果,那么我们的基本情况应该反映这个和 return 一个数字(不是一个空列表),并且组合步骤应该 添加 个数字,而不是 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