在方案中结合计数和展平功能
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
所以我有这两个功能可以单独使用。我正在尝试编写一个函数来完成这两个功能,但我一直遇到汽车错误。关于解决此问题的最佳方法的任何指导?
(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