方案在列表的列表中添加奇数元素

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

您的解决方案有两个错误:

  1. (list? (car lst))时,你必须将(car lst)(cdr lst)相加。
  2. 您在 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))