ECL可以計算fac(1000)真是太棒了! ECL如何做到這一點?ECL爲什麼可以計算階乘(1000)?
>(defun fac (n) (if (= n 1) 1 (* n (fac (- n 1)))))
>(disassemble #'fac)
#(FAC N = - * #<bytecompiled-function FAC> SI:FSET)
Name: FAC
0 POP REQ
1 BIND N
3 NOMORE
4 PUSHV 0
6 PUSH 1
8 CALLG 2,=
11 JNIL 18
13 QUOTE 1
15 SET VALUES(0),REG0
16 JMP 35
18 PUSHV 0
20 PUSHV 0
22 PUSH 1
24 CALLG 2,-
27 PUSH VALUES(0)
28 CALLG 1,FAC
31 PUSH VALUES(0)
32 CALLG 2,*
35 EXIT
我對ECL字節碼知之甚少。似乎沒有尾遞歸優化。任何專家都可以解釋嗎?
真誠!
這是字節碼,但可能解釋器可以做優化? 1000級別的堆棧並不是一個真正的問題 - 解釋器實現應該已經處理了這個事件(如果它確實對這種情況進行遞歸)。 – nhahtdh
1000確實不是問題。 '(defun fac(n)(reduce#'*(從1到n的循環收集i)))'甚至計算(fac 30000)或更多。精彩(E)CL,謝謝! –
如果解釋器確實保留了一個堆棧,它將被實現爲數據結構來像堆棧一樣工作,因此它可以任意堆疊多層(不確定內部實現,但它可能會施加一個限制,或者限制是系統的限制)。 – nhahtdh