リストがあるとしましょう((3 4 5) (d e f) (h i j) (5 5 5 5))
出力が次のようになるように、各リストの最後の要素を取得するにはどうすればよいですか (5 fj 5)?
これが Common Lisp に関するものであると仮定すると、リストの最後の項目を含むリストを返す関数lastがあります。リストの各要素に特定の関数を適用し、連結された結果を返すmapcanでこの関数を使用すると、必要なものが得られます。
ただし、リストの最後の要素へのアクセスはO(N)
操作であるため、これが単なる宿題ではない場合は、各リストの最後の項目を取得するよりも効率的に実際の問題を解決できないかどうかを検討することをお勧めします (代わりに別のデータ構造を使用することもできます)。
これは、ほとんどの初期の LISPy 宿題問題と同様に、再帰的に考えたり、帰納法で考えたりする演習です。始める方法は、簡単に答えられる簡単な質問を自問することです。
たとえば、各リストの最初の要素を与えるものを書くように求められた場合、私は次のように処理します。
リストのリストが与えられた場合:
'()
ですか? (かんたん~null
)'(a)
ですか? (簡単 - a
、またはおそらくエラー)'((a))
ですか? (かんたん~(a)
)'(anything)
何ですか? (かんたん~(first anything)
)'(anything morestuff)
ですか? (かんたん~(cons (first anything) (first-element morestuff))
)nil
.(car list)
ここから、コードを書き始めることができます。
;; here's first, meeting questions 6-8
(define first (lambda (l)
(cond
((null? l) nil) ; Q7
((atom? l) l) ; Q6
(t (car l))))) ; Q8
;; with first we can write first-element, meeting questions 1-5
(define first-element (lambda (l)
(cond
((null? l) nil) ; Q1
((atom? l) (first l)) ; Q2
(t (cons (first (car l) (first-element (cdr l)))))))) ; Q4-5
これは宿題ではありません (意図的に)。これで遊んで、それがどのように機能するかを理解する必要があります。あなたの次の目標は、これがあなたの割り当てとどのように違うのか、そしてそこに到達する方法を見つけることです.
MAPCARに関しては?ご心配なく。最初に再帰問題を解決する方法を学ぶ必要があります。次に、MAPCAR について心配することができます。この任務のポイントは何ですか?このモードで考える方法を学ぶのに役立ちます。LISP/Schemeのほぼすべてのダン グは、このように考えることで解決されます。
私がすべての質問を行って、私が心配している部分に分解した理由. 「リスト内のすべての項目に対して foo を実行するにはどうすればよいですか?」というタスクが与えられた場合。質問に答える必要があります: null を処理するにはどうすればよいですか? 原子をどのように扱うのですか?リストの最初の要素を処理するにはどうすればよいですか? 他のすべてをどのように処理しますか? それに答えたら、実際に foo を実行する方法を理解します。null で foo を実行するにはどうすればよいですか? アトムで foo を実行するにはどうすればよいですか? リストで foo を実行するにはどうすればよいですか?
おそらくそれはすでに解決されていますが、私はこれを理解しました
; SELECT-FROM-INNER-LIST :: [list] -> [list]
(DEFUN SFIL (lst)
(COND ((NULL lst) NIL)
((LISTP (FIRST lst)) (APPEND (LAST (FIRST lst)) (SFIL (REST lst))))
))
これで、これは正当なリストに対して機能します...したがって、正しいリストを使用して関数SFILを呼び出すと、そうでない場合はNILが返されます。
うまくいけば、これはそれを見つけた人にとって役立つでしょう
リストの最後の要素を返す手続きを書いてから、組み込みのMAP
(別名MAPCAR
) 手続きについて少し学び、電球が消えるかどうかを確認してください。
(defun get-last-lists (s)
(setq rt 'nil)
(loop for i from 0 to (- (length s) 1)
do (setq rt (append rt (last (nth i s)))))
(print rt))
Lisp の初心者として、私は自分のソリューションを投稿します。