なんだこれは

はてなダイアリーから移転しました。

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)))
     )
    )
  )
)

疑問

この辺誰かに聞けるといいんだけどなぁ。誰か教えてください。

reverseを使った方がいいの?

うーん。reverseを使ってる。reverseした方が早いとか?うーん。
lengthも両方使うと、あれでしょ、全体を二回読む気がしません?うーん。
fu7mu4って貧乏性なのでしょうか?

もっと富豪的に考えてもいいのかも?

空リストテスト

((null reverso) nil)の行ってなくても下の行でOKな気もする。速度?
速度なら最初に排除した方が?

(if ( null lista )
  nil
  (.....