我正在努力让以下程序工作,但由于某种原因,它一直告诉我,我的输入不包含正确数量的参数,为什么?这是程序
(define (sum f lst)
(cond
((null? lst)
0)
((pair? (car lst))
(+(f(sum (f car lst))) (f(sum (f cdr lst)))))
(else
(+ (f(car lst)) (f(sum (f cdr lst)))))))
这是我的输入:(sum (lambda (x) (* x x)) '(1 2 3))
谢谢!
顺便说一下,我对这段代码毫不在意,我只是玩得很开心(http://groups.engin.umd.umich.edu/CIS/course.des/cis400/scheme/listsum.htm)
答案 0 :(得分:4)
您确实向程序sum
和f
传递了错误数量的参数,请注意表达式(sum (f car lst))
,(sum (f cdr lst))
是错误的,当然您的意思是{ {1}},(sum f (car lst))
- 您不希望将(sum f (cdr lst))
(单参数过程)应用于您传递的两个参数,而f
需要两个参数,但只有一个通过。试试这个:
sum
更重要的是:你在错误的地方调用(define (sum f lst)
(cond ((null? lst)
0)
((pair? (car lst))
(+ (sum f (car lst)) (sum f (cdr lst))))
(else
(+ (f (car lst)) (sum f (cdr lst))))))
程序。最后一行只需要一个电话,对于f
只是一个数字而不是列表的情况 - 在其他地方,(car lst)
和(car lst)
都是需要的列表被遍历;只需将(cdr lst)
作为参数传递,以正确推进递归。
让我们尝试使用更有趣的输入更正过程 - 实际上,该过程能够找到任意嵌套列表列表的总和:
f
您应该查看The Little Schemer或How to Design Programs,这两本书将教您如何在列表列表中构建解决此类递归问题的解决方案。