在计划中结合计数和展平功能

时间:2015-02-04 01:10:40

标签: 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))))))))

1 个答案:

答案 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
相关问题