2

タスク: List を使用して文字列を文字のリストとして定義し、再帰関数を記述して文字列の長さを返します。

この課題のコードを書きましたが、うまくいきません。

以下は私のコードです:

(defun stringlength  (string)
 ;;  "Compute the length of str."

   (if (string= string nil )   0

       (+ 1 (stringlength(subseq string 1)))))

コマンドラインで次のように入力しました。

cl-user(32): (stringlength "aaa")

それは私にエラーを与えました:

Stack overflow (signal 1000)
  [condition type: synchronous-operating-system-signal]

誰でもこれで私を助けることができますか? どうもありがとうございました!!!

4

1 に答える 1

2
(defun stringlength (string)
  (if (string= string nil)
      0
      (+ 1 (stringlength (subseq string 1)))))

関数が文字のリストを想定していることを文書化またはテストする必要があります。そうでなければ、STRING と文字列操作は Lisp に組み込まれており、文字列はリストではないため、混乱を招きます。

あなたはすでにそれに混乱しています;-)。STRING=組み込みの type に対して定義された Lisp の関数STRINGです。あなたのタスクは文字のリストに対する操作を実装することであるため、使用できません。またSUBSEQ、間違った機能です。

置き換えるSTRING=には、何かが空のリストかどうかをテストする関数が必要です。

置き換えるSUBSEQには、 head 要素を削除したリストを返す関数が必要です。

(stringlength "aaa")

それ以上も間違っています。組み込みの文字列型ではなく、文字のリストで呼び出す必要があります。あなたのタスクを参照してください。関数LISTを参照し、Lisp での文字の書き方も参照してください。

于 2012-07-23T08:20:15.033 に答える