[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bep] learning lisp: recursive



 高橋です。

(defun n (n) (if (= n 1) 1 (* n (n (1- n)))))
について、

Reply Koichi INOUE <inoue@...>'s message:

} (n (a- n))
} の最初のnは今まさに定義しようとしている関数n自身。
} (1- n)
} は「nから1を引いたもの」
} # C-h f 1- RET
} (if 条件 真のとき 偽のとき)
} 条件が真なら「真のとき」を実行。そうでなかったら「偽のとき」を実行。
} ただし、lispのif文の特徴なのか、「真のとき」は一つの評価単位でなければな
} らないので、複数の関数を続けて実行させたかったら(progn ..)なんかを使う。
} (今は関係ない)

 nと2をかけたものだと(2* n)って書いたりもできるんですか?


Reply TAKAHASHI Naoto <ntakahas@...>'s message:

} (defun fact (n)
}   (if (= n 1)
}       1
}     (* n (fact (- n 1)))))

(defun fact (n)

関数名は fact で、そこで使う引数はn。

  (if (= n 1)

nが1だったら

      1

1(って……なんでしょう……?)。
1っていう値を返してっていうことですか?

    (* n (fact (- n 1)))))

そうでなければ、n と (fact (- n 1))をかける。
fact (- n 1) は……?
factって、その寸前というか、すぐ外(?)で定義してるんですよね? こんなこと
ができるなんて不思議というか、やっぱりわからないかも。

n が 1だったら、n=1なので 1?

n が 2だったら……。
(* 2 (fact (- 2 1))) ==> (* 2 fact(1))
で、fact(1) は……あちゃあ、わかんない〜(^_^;)。
()の中が1だから、n=1(???)だから、1……?

n が3 だったら……?
(* 3 (fact (- 3 1))) ==> (* 3 fact(2))
で、fact(2) は……
()の中が2だから、n=2……? だと、あちゃあ、またわかんない(^_^;)。

 もう混乱の極みです! 1年後にはわかるようになっているといいな。
精進します(^.^)。


**-***-***-***-***-***-***-***-***-***-***-***-**
           Reiko TAKAHASHI  (高橋玲子)
         E-mail:  HFC03614@...
         ICQ UIN: 85924121  (Twinkle)
**-***-***-***-***-***-***-***-***-***-***-***-**