:
(if (< n 1)
(list 1)
(if (= n 1)
(last l)
(bell #| ... |#)))
はもっと慣用指揮、およびによく似ていますリストではなく、リットルを、使用するだろう私のデバッグコードを2回印刷していますが、ファンクションは最初の呼び出しでベースケースを満たす必要があります。
if
は、あなたが思っていることを行っていないため、2回印刷されています。最初のifテストが真であるので、はゼロです!が印刷されます。その後、三角関数への再帰呼び出しが呼び出されます。テストは再び真(-1 < = 0)なので、はゼロに等しい!が再度印刷されます。最後に、nthcdr
関数が-1で呼び出されるため、エラーが発生します。良いlispデバッガをお勧めします。 Lispworksのものはかなり良いです。
私はあなたのコードで達成しようとしていたことの論理を正直にとらえていません。私は私が書いた:インプリメンテーションを理解する
(defun generate-level (l &optional (result))
"given a list l that represents a triangle level, it generates the next level"
(if (null l) result
(if (null result)
(generate-level l (list (car (last l))))
(generate-level (cdr l) (append result
(list (+ (car l)
(car (last result)))))))))
(defun bell (levels &optional (l))
"generate a bell triangle with the number of labels given by the first parameter"
(unless (zerop levels)
(let ((to-print (if (null l) (list 1) (generate-level l))))
(print to-print)
(bell (1- levels) to-print))))
もの:
&optional (parameter)
:このパラメータはオプションであり、デフォルトではnilです。
append
は2つのリストを連結します。私はそれを使ってリストの後ろに挿入します。
let ((to-print x))
は、to-print
という新しい変数バインディング(ローカル変数)を作成し、x
に初期化されます。 (if (= x 1) y z)
手段1に等しいx
ならば、そうでないz
、y
を返す:
- は、私はほとんどのCommon Lispで
if
作品がどのように言及するのを忘れてしまいました。あなたは7つのレベルのベルの三角形を作成するための関数を呼び出す場合
は今:
1
1 2
2 3 5
5 7 10 15
15 20 27 37 52
52 67 87 114 151 203
203 255 322 409 523 674 877
:
CL-USER 9 > (bell 7)
(1)
(1 2)
(2 3 5)
(5 7 10 15)
(15 20 27 37 52)
(52 67 87 114 151 203)
(203 255 322 409 523 674 877)
NIL
このように、appropiateパディングでそれを印刷するにはよりよいだろう私はそれを読者の練習として残しました。
((ステートメントを実行)(他に)この文を実行する)条件(あれば)の場合、ブロックが何かのよう..
を働いていたことに気づきました**は三角形を作成しようとしていますが、OPは実際の問題をここでも確認しています。関数*は予想されるベースケースで終了しません。これは** if **のグループ化によるものです。三角関数の解法はOPを助けるかもしれないが、実際には、なぜ(例えば、(n(n 0)35)42) '' defun foo(n) ** if **の結果は無視されるためです。 –
@JoshuaTaylor私はあなたの意見を得る。 OPは、三角形を解決する方法については求めていないが、なぜ彼はそのエラーを持っているのですか?とにかく、私は、現在のものがエラーを表すものではないので、ポストがより役立ち、より適切なタイトルで簡単に見つけられると思った。 – FrankS101