-1

コード:

(defun len (x count)
  (cond ((null x) ())
        (t (+ count 1)
           (len (cdr x)))))

この関数を (len '(abc) 0) で呼び出そうとすると、関数に引数を 1 つだけ送信していて 2 つ必要であるというエラーが表示されます。

私は何を間違っていますか?このまったく同じコードを使用してエラーなしで関数を1回実行したため、特に混乱していますが、もう機能しないと判断しました。

4

2 に答える 2

4

には(len '(a b c) 0)正しい数の引数がありますが、関数内の再帰呼び出しに(len (cdr x))はありません。カウントの 2 番目の引数がありません。

関連する注意事項として、あなたは を計算しています(+ count 1)が、計算の結果に対して何もしていません。

于 2012-11-12T02:17:51.980 に答える
2

Augmenting @sepp2k's answer, what you want to do is to pass the incremented count as the second argument to len, and, also, return count instead of NIL for empty arguments:

(defun len (x &optional (count 0))
  (if x 
      (len (cdr x) (1+ count))
      count))
于 2012-11-12T14:23:07.017 に答える