
無為的程式設計
|
205
雖然大多認為這個實作物比原本的簡單,但一般來說它不僅更難以閱讀且效率較低,因
為它總是執行狀況最糟的重複呼叫次數,而不是盡快停止。它也不會等於原來的版本,
因為如果我們要求它除以
ZERO
(條件式
n <= m
永遠不會變成 false),舊版本的
MOD
將會
永遠循環,而這個實作物只會傳回它的第 1 個引數:
>> to_integer(MOD[THREE][ZERO])
=> 3
RANGE
雖然稍微具有挑戰性,但是我們可以使用類似讓
DECREMENT
運作的技巧:設計
一個函式,在某些初始引數呼叫
n
次時,能從所需的範圍傳回
n
個數值的串列。和
DECREMENT
相同的是,其中的秘密是使用對組來儲存結果的串列和下一次迭代所需的資
訊:
def countdown(pair)
[pair.first.unshift(pair.last), pair.last - 1]
end
>> countdown([[], 10])
=> [[10], 9]
>> countdown(countdown([[], 10]))
=> [[9, 10], 8]
>> countdown(countdown(countdown([[], 10])))
=> [[8, 9, 10], 7]
>> countdown(countdown(countdown(countdown([[], 10]))))
=> [[7, 8, 9, 10], 6]
這很容易以 proc 重新編寫:
COUNTDOWN = -> p { PAIR[UNSHIFT[LEFT[p]][RIGHT[p]]][DECREMENT[RIGHT[p]]] ...