1

我试图让以下程序工作,但由于某种原因,它一直告诉我我的输入不包含正确数量的参数,为什么?这是程序

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

4

1 回答 1

4

您确实向过程传递了错误数量的参数,sum并且f注意表达式是错误的(sum (f car lst))(sum (f cdr lst))当然您的意思是(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在错误的地方调用了该过程。最后一行只需要一个调用,因为 when(car lst)只是一个数字而不是一个列表 - 在其他地方,两者(car lst)(cdr lst)都是需要遍历的列表;f只需作为参数传递,以正确推进递归。

让我们用一个更有趣的输入来尝试更正的过程——事实上,这个过程能够找到任意嵌套列表的总和:

(sum (lambda (x) (* x x)) '(1 (2) (3 (4)) 5))
> 55

您应该看一下The Little SchemerHow to Design Programs,这两本书都将教您如何为列表列表上的此类递归问题构建解决方案。

于 2012-09-17T11:11:41.477 回答