2

サブセット合計の問題を解決するのに役立つ 2 つの関数を作成しました。私はエラーが発生しているようです。に 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))))))

1 つの引数で「compound-procedure #(number) ssum」を呼び出したこと、および 2 つの引数が必要であることを示しています。として渡してい(ssum 8 (list 1 3 5 7))ます。

私の質問は次のとおりです。

  1. 機能を正しくセットアップしましたか?
  2. my 内のリストの数値を合計する簡単な方法はありssumますか?
  3. 私はSchemeも初めてです。コードを短縮する明らかな方法を見つけた場合は、お気軽に修正してください。
4

2 に答える 2

0

Racketを試すことを強くお勧めします。その IDE には、ODBだけが優れていると主張できる素晴らしいデバッガーがあります。

実際に((ssum (cons (car l)) (cdr (cdr l))))は行にいくつかのエラーがあるため、コードがどのように機能するかについてはあまり深く掘り下げませんでしたconscond少なくとも 1 つの式が背後にあります。

于 2011-07-15T01:17:24.160 に答える
-1

リストサム機能を最適化できます。まず、2 つの式を結合することができ、3 つの式を 1 つ(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 に答える