labunix's blog

labunixのラボUnix

clispの再帰で要素が10個で0から9までの等差数列の和をトレースする。

■clispの再帰で要素が10個で0から9までの等差数列の和をトレースする。

 bashとclispとawkで小学三年生レベルの等差数列の総和
 http://d.hatena.ne.jp/labunix/20130114

 難しく考えれば難しくなるというお話。clispとbashの例。
 http://labunix.hateblo.jp/entry/20140413/1397316749

■以下で十分だと思うのですが。。。

$ echo "(+ `seq 0 9`)" | clisp -q
[1]> 
45

$ echo "`seq 0 9`))))))))))" | sed -e 's/^/(+ /' | tr -d '\n' | clisp -q
[1]> 
45

■今回は再帰で。

$ echo '(defun fact (n)(if (= n 0) n (+ n (fact (- n 1)))))(fact 9)' | \
  clisp -q 
[1]> 
FACT
[2]> 
45

■再帰だとトレースしたくなるので、「(trace fact)」を挟む。

$ echo '(defun fact (n)(if (= n 0) n (+ n (fact (- n 1)))))(trace fact)(fact 9)' | \
  clisp -q 
[1]> 
FACT
[2]> 
;; Tracing function FACT.
(FACT)
[3]> 
1. Trace: (FACT '9)
2. Trace: (FACT '8)
3. Trace: (FACT '7)
4. Trace: (FACT '6)
5. Trace: (FACT '5)
6. Trace: (FACT '4)
7. Trace: (FACT '3)
8. Trace: (FACT '2)
9. Trace: (FACT '1)
10. Trace: (FACT '0)
10. Trace: FACT ==> 0
9. Trace: FACT ==> 1
8. Trace: FACT ==> 3
7. Trace: FACT ==> 6
6. Trace: FACT ==> 10
5. Trace: FACT ==> 15
4. Trace: FACT ==> 21
3. Trace: FACT ==> 28
2. Trace: FACT ==> 36
1. Trace: FACT ==> 45
45