L-99:P02 翻訳だってやっちゃうよこれでも責任重いlisperだもん
L-99:P02にチャレンジしました。
コード中のコメントはgoogle翻訳を参考に意訳。
問題
与えられたリストの一つ前と最後の要素のリストを返す関数を作りなさい。
P02 Find the last but one box of a list
Example:
(my-but-last '(a b c d)) ;;-> (C D)
fu7mu4の回答。
再帰だから、中でlengthを呼ぶと、バカみたいだし、ってことは、
前からリストを削っていって2個にするんでしょう?
(defun my-but-last (lst) ;再帰するぞ再帰するぞ再帰するぞ (cond ((null lst) ;短い:入力リストが空の時はnilを返す nil) ((null (cdr lst)) ;短い:入力リストが次の要素/リストを持っていないときはnilを返す nil) ((null (cdr (cdr lst))) ;これこれ:入力リストが二個の要素の時は、 (list ;次の要素と次の次の要素のリストを返す (car lst) (car (cdr lst)))) ((t) (my-but-last (cdr lst))) ;それ以外は先頭要素を除いてもう一回再帰 ) )
なんとなくhaskellっぽい?
答え合わせ
(defun penultimo (lista) (let ((reverso (reverse lista))) ; reversoに入力listaの逆並びを入れる。 (cond ((null reverso) nil) ;; 入力リスト lista が2つ未満の要素を持つ時は、入力リストを返す。 ((<= (length reverso) 2) lista) ;; それ以外の時は、リストを作成する。 (t (list (second reverso) (first reverso))) ) ) ) )