2

我创建了两个函数来帮助我解决子集总和问题。不过,我似乎遇到了错误。它告诉我,我将两个参数传递给list-sum. 我已经在这个程序上玩了几个小时了。我想知道是否有人能发现问题。

这是我的list-sum

(define list-sum 
  (lambda(lst)
    (cond
      ((null? lst) 0)
      ((pair? (car lst))
       (+(list-sum (car lst)) (list-sum (cdr lst))))
      (else
       (+ (car lst) (list-sum (cdr lst)))))))

这是我使用的函数list-sum

(define ssum
  (lambda (n l)
    (cond
      ((null? l) #f)
      ((=(-(- n (car l))(list-sum l)) 0) l)
      ((ssum (cons (car l)) (cdr (cdr l))))
      (else (ssum n (cdr l))))))

它告诉我,我用一个参数调用了“compound-procedure #(number) ssum”,并且它需要两个参数。我把它作为(ssum 8 (list 1 3 5 7)).

我的问题是:

  1. 我是否正确设置了我的功能?
  2. 有没有一种更简单的方法可以将我的列表中的数字相加ssum
  3. 我对Scheme也很陌生。如果您看到缩短代码的明显方法,请随时纠正我。
4

2 回答 2

0

我强烈建议你试试球拍,它的 IDE 有这个很棒的调试器,只有ODB可以声称它更好。

我没有深入研究您的代码应该如何工作,因为该((ssum (cons (car l)) (cdr (cdr l))))行中实际上存在几个错误:您cons只使用一个参数进行调用,但您在此子句中也只有一种形式cond,而它应该有一个测试后面至少有一个表情。

于 2011-07-15T01:17:24.160 回答
-1

list-sum 函数可以优化。首先,可以连接两个(list-sum (cdr lst))表达式,并且可以将三个(car lst)表达式简化为一个:

(define (list-sum lst)
  (if (null? lst)
      0
      (+ (let ((l (car lst)))
           (if (pair? l)
               (list-sum l)
               l))
         (list-sum (cdr lst)))))
于 2011-05-02T15:57:29.680 回答