以APL計算黃金比例

APL 語言之中,有一個運算子"power"可以幫助計算數學中的黃金比例。 APL 表達式幾乎與數學定義一樣漂亮、簡潔: 沒錯,只有7個 unicode 字元的表達式,便計算出黃金比例。對數論稍有認識的同仁,也許知道黃金比例的連續分數是: (圖片連結自 維基百科 ) 其定義不太明顯地使用了遞迴,以一般編程語言表現的話大概離不開: def phi(N): return 1 + (1 % phi(N)) end 根據數論,無理數只能以無限連續分數表達,即上面圖示中的 "..." 應該無窮盡地延伸下去,才為之正確的黃金比例。而上述函數定義亦導致無限遞迴,定義上雖然沒有錯,但運作上會導致 stack overflow,很難說是正確的程式。 那麼,APL 是如何僅憑十個字元計算出黃金比例呢?或者首先應該問:APL 返回的值正確嗎?以下係 Wolfram 所給的黃金比例的小數約數: 1.618033988749894848204586834365638117720309179805762862135... 而 APL 給出的值(使用 NARS2000 實作): 1.618033988749894 可見小數點後16個位被截斷 (truncate) 了,而小數點後1至15位都脗合。先撇除電腦表達、顯示浮點值的複雜問題, 1.618033988749894應該是可接受的約數。 下一個問題:APL 表達式是如何達致遞迴?秘訣在於 ⍣ 稱呼作"power"的運算子。 表達式 {1+1÷⍵}⍣≡1 中, ⍣ 的作用是 呼叫 {1+1÷⍵} 1 結果為整數2,與原先的參數(整數1)以函數 ≡ 比較 2≡1 返回整數0亦即布林值false 如果上一步得出結果為布林值true,則以整數2為答案,否則繼續下一步 返回第一步,以整數2作為輸入 也許將 ≡ 函數替換成先把左、右參數列印的匿名函數會比較容易理解: ...