你如何将结构列表中的数字相加? (球拍)

时间:2016-12-13 22:22:38

标签: list struct functional-programming scheme racket

我正在尝试使用递归函数对结构列表中的所有整数求和,但不能在我的生活中弄明白。

(struct number (int))
(define ints (list (number 1)
                   (number 2)
                   (number 3)))

(define sum (λ (number)
            (cond
              ((null? number) 0) ; Base Case
              (#t (+ (number-int (car ints)) ; Take the first of the list
                     (sum (cdr ints))))))) ; Rest the list

我花了小时尝试不同的变体:

  

(cdr ints),即最后一行的(number-int(cdr ints))

我认为导致此问题的原因((cdr ints)(number-int (cdr ints))都会以'(#<number> #<number>)的形式返回。但似乎没有任何效果!

是否有一个以整数列表而不是'(#<number> #<number>)的形式返回列表的 cdr 的过程?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

试试这个:

(define sum 
  (λ (lst)
    (cond ((null? lst) 0)
          (else (+ (number-int (car lst))
                   (sum (cdr lst)))))))

一些评论:

  • 使用else代替#t代表cond表达式中的最后一个条件
  • 您正在将过程参数number的名称与您在外部定义的ints列表的名称混合使用
  • 最好将其重命名为lst或其他能够明确表示您正在处理的列表的内容

现在它按预期工作:

(sum ints)
=> 6

答案 1 :(得分:0)

可以使用带有变量来存储和值的递归命名let:

(define (sum lst)
  (let loop ((lst lst)
             (s 0))
    (if (empty? lst)
        s
        (loop (cdr lst)
              (+ s
                 (number-int (car lst)))))))