-2
(defun sum-n-numbers(n)(if(=n 1)
1
(+N(sum-n-numbers(-n 1))))) 

編集 2: 上記のコードは実行されますが、出力に (SUM-N-NUMBERS 1 3 2) と入力すると機能せず、エラーが発生します。 この単純なコードは、数値の合計を自動的に計算する inbuild lisp 関数 (+ 1 3 2) によっても実行できることは知っていますが、defun 関数を使用して n 個の数値の合計を計算するよう求められる試験問題があります。 .(defun sum-n-numbers(n) (if(=n 1) 1 (+N(sum-n-numbers(-n 1)) )
)
)

編集1:これは私が得ているエラーです:

Error: Call ((LAMBDA (#:N) (DECLARE (SPECIAL:SOURCE #) (LAMBDA-NAME SUM-N-NUMBERS))                  (BLOCK #:SUM-N-NUMBERS (IF # 1 #))) 1 3 2) has the wrong number of arguments.
1 (abort) Return to level 1.
2 Return to debug level 1.
3 Return to level 0.
4 Return to top loop level 0.
4

3 に答える 3

2

あなたが望むものを正確に得るには:

(defun sum-n-numbers (&rest nums)
    (if (null nums) 0 
        (+ (car nums) (apply #'my-sum (cdr nums)))))

これは、任意の数の引数を取り、それらの合計を再帰的に計算します。例えば:

(sum-n-numbers 1 2 3) => 6

再帰ではなく反復を使用する:

(defun sum-n-numbers (&rest nums)
    (loop for num in nums summing num))

ユーザーの観点からは、これらは同じですが、内部での動作が少し異なるだけです。そして、これらの両方が機能することを確認するためにテストしました。

于 2013-07-19T17:01:14.687 に答える
2

どうしたの:

(apply '+ '(1 3 2))

??

(defun sum (numbers)
  (if (null numbers)
      0
      (+ (first numbers) (sum (rest numbers)))))

(sum '(1 3 2))

テストしませんでした。手元にLispインタープリターがありません。

于 2013-03-06T18:14:36.593 に答える
0

あなたが書いた関数は、1 つの引数を受け入れ、1 から引数までの数値の合計を返します (理論的には返されず、実際には負の引数の場合はスタック オーバーフローで失敗することに注意してください)。

その関数は、渡された 3 つの引数を受け入れることができないため、エラーが発生しました。

于 2013-03-06T18:11:28.920 に答える