List 如何对结构列表中的数字求和?(球拍)
我试图使用递归函数对结构列表中的所有整数求和,但我一辈子都搞不懂List 如何对结构列表中的数字求和?(球拍),list,struct,functional-programming,scheme,racket,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 (
(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),即最后一行的(数字int(cdr ints))
我相信正是这一点导致了这个问题(包括(cdr ints)
和(number int(cdr ints))
以”(##)的形式返回一些东西。但似乎什么都不起作用
是否有以整数列表的形式返回列表的cdr而不是'(##)的过程
任何帮助都将不胜感激。试试以下方法:
(define sum
(λ (lst)
(cond ((null? lst) 0)
(else (+ (number-int (car lst))
(sum (cdr lst)))))))
一些评论:
- 对于
cond
表达式中的最后一个条件,使用else
而不是#t
- 您将过程参数
number
的名称与您在外部定义的ints
列表的名称混合在一起
- 最好将其重命名为
lst
,或者其他可以清楚显示您正在处理的列表的名称
现在它如预期的那样工作:
(sum ints)
=> 6
可以使用带有存储和值的变量的递归命名let:
(define (sum lst)
(let loop ((lst lst)
(s 0))
(if (empty? lst)
s
(loop (cdr lst)
(+ s
(number-int (car lst)))))))
“ints”的名称非常糟糕;表明它是一个int列表,但它是一个“数字”列表(即结构);因此更好的名称可以是数字
。然后,定义总和数字
函数,称为(总和数字)
,或总和数字
,称为(总和数字)
。第一个需要数字
,即数字
结构列表;第二个需要int列表,因此我们必须将“number”结构列表转换为int数字列表(使用映射
)。