リスト内のアトムの位置を探しようとしています。アトムの位置を見つける - 存在しない場合はnilを返します。
期待される結果:
(position-in-list 'a '(a b c d e))
が0
(position-in-list 'b '(a b c d e))
を与える1
(position-in-list 'Z '(a b c d e))
がnilを与える与えます。
私は項目がリストにあるときに正しく位置を与える機能を持っている:
(defun position-in-list (letter list)
(cond
((atom list) nil)
((eq (car list) letter) 0)
(t (+ 1 (position-in-list letter (cdr list))))))
それは(atom list)
に到達したかのような問題は、項目が存在しない場合にはnilを返さないことですnilはこのエラーを返します:*** - 1+: nil is not a number
as unacksとき、それはnil
に値を追加しようとします。
アイテムがリストにないときに正しくnil
を返すように(同じ構造を保って)この関数を適合させる方法はありますか?
注:
私は図書館で
position
機能があることを知っているが、私はそれを使用する必要はありません。私の質問はthis oneと似ていますが、上記で言及した問題は解決されていません。あなたの答えのためのあなたのすべてに
*編集* 感謝。あなたが言及したすべての提案を理解するのに必要な知識はありませんが、それは参考になりました。
私は私の問題への別の修正を発見した:この実装は末尾再帰ではないことに注意してください
(defun position-in-list (letter list)
(cond
((atom list) nil)
((eq (car list) letter) 0)
(t
(let ((found (position-in-list letter (cdr list))))
(and found
(1+ found))))))
:
(defun position-in-list (letter liste)
(cond
((atom liste) nil)
((equal letter (car liste)) 0)
((position-in-list letter (cdr liste)) (+ 1 (position-in-list letter (cdr liste))))))
これはあいまいで非効率的です。あなたが勉強しようとしているので、私はあなたがckearestを探して、最も効率的であることを期待します。 (これは既にsdsによって提供されていますが、 – kennytilton