我正在尝试使用递归函数对结构列表中的所有整数求和,但不能在我的生活中弄明白。
(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 的过程?
非常感谢任何帮助。
答案 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)))))))