方案在列表的列表中添加奇数元素
Scheme Adding odd elements within a list of a list
我正在尝试将我的列表中的所有奇数原子添加到列表中,以便获取每个奇数原子并将它们加在一起。我收到一条错误消息:
+:违约
预期:数字?
给出:()
所以我假设我到达列表的末尾并在添加时抛出一个空列表?但我不确定如何解决或解决这个问题。
(define (sumodd list)
(cond ((null? list) 0)
((list? (car list)) (sumodd (cdr list)))
((odd? (car list))
(+ (car list) (sumodd (cdr list))))
(sumodd (cdr list))
))
(sumodd '(1 (2 () 6) 3 (5) 8))
首先,不要使用符号list
作为变量名。 list
的值为 #<procedure:list>
,当您重写此值时,您将无法使用该功能。参见示例:
(define (testlist list)
(list list))
(testlist (list 1 2 3))
您的解决方案有两个错误:
- 当
(list? (car lst))
时,你必须将(car lst)
和(cdr lst)
相加。
- 您在
cond
的最后一个分支中缺少 else
子句。
解决方案:
(define (sumodd lst)
(cond ((null? lst) 0)
((list? (car lst)) (+ (sumodd (car lst))
(sumodd (cdr lst))))
((odd? (car lst)) (+ (car lst)
(sumodd (cdr lst))))
(else (sumodd (cdr lst)))))
(sumodd '(1 (2 () 6) 3 (5) 8))
这个结果也可以通过以下方式实现:
(require racket/list)
(define (sumodd2 lst)
(apply + (filter odd? (flatten lst))))
(sumodd2 '(1 (2 () 6) 3 (5) 8))
我正在尝试将我的列表中的所有奇数原子添加到列表中,以便获取每个奇数原子并将它们加在一起。我收到一条错误消息:
+:违约 预期:数字? 给出:()
所以我假设我到达列表的末尾并在添加时抛出一个空列表?但我不确定如何解决或解决这个问题。
(define (sumodd list)
(cond ((null? list) 0)
((list? (car list)) (sumodd (cdr list)))
((odd? (car list))
(+ (car list) (sumodd (cdr list))))
(sumodd (cdr list))
))
(sumodd '(1 (2 () 6) 3 (5) 8))
首先,不要使用符号list
作为变量名。 list
的值为 #<procedure:list>
,当您重写此值时,您将无法使用该功能。参见示例:
(define (testlist list)
(list list))
(testlist (list 1 2 3))
您的解决方案有两个错误:
- 当
(list? (car lst))
时,你必须将(car lst)
和(cdr lst)
相加。 - 您在
cond
的最后一个分支中缺少else
子句。
解决方案:
(define (sumodd lst)
(cond ((null? lst) 0)
((list? (car lst)) (+ (sumodd (car lst))
(sumodd (cdr lst))))
((odd? (car lst)) (+ (car lst)
(sumodd (cdr lst))))
(else (sumodd (cdr lst)))))
(sumodd '(1 (2 () 6) 3 (5) 8))
这个结果也可以通过以下方式实现:
(require racket/list)
(define (sumodd2 lst)
(apply + (filter odd? (flatten lst))))
(sumodd2 '(1 (2 () 6) 3 (5) 8))