我在學習Haskell,誰能給我解釋一下,為什么這個函式能作業? 我的意思是,歸納的情況下,如何不永遠運行? 這里的停止條件是什么?
myLength :: [a] -> Integer。
myLength [] =0
myLength (x:xs) = ( 1) (myLength xs)
uj5u.com熱心網友回復:
停止條件是串列已經用完,所以是[]/code>模式。在這種情況下,Haskell將回傳一個0。
在遞回的情況下,我們因此與任何非空串列(x:xs)相匹配,x是第一個元素,而xs是尾(剩余元素的串列)。在這種情況下,我們會回傳1 myLength xs,所以我們在尾部進行遞回。
這意味著對于每一個無限的串列,我們最終將以[]為引數進行遞回呼叫,從而回傳0。
因此,Python 中的等效演算法將看起來像:
def myLength(items)。
if len(items)。
return myLength(items[1:]) 1
else:
回傳 0。
這里計算尾巴將花費O(n),而在Haskell中它將花費O(1)。
uj5u.com熱心網友回復:
第一行描述了型別:它接收一個東西的串列并回傳一個Integer。
接下來的兩行是函式的實作:哪一行被執行取決于傳入的引數是什么。這就是所謂的模式匹配。
第二行說,如果傳入的串列是空的,則函式回傳 0。
否則,該函式收到一個非空的串列,其中第一個元素被稱為 x,串列的其余部分被稱為 xs。它在用 xs 呼叫自己的結果中加入 1。
因此,一旦這個函式被呼叫,每一次迭代都會收到一個更小的串列來處理,直到有一次呼叫收到空串列,這時就會呼叫第二行。
uj5u.com熱心網友回復:
函式可以在Haskell中以分片的方式定義;案例從上到下檢查,第一個適用的案例被使用。
這個定義可以更明確地寫成
。myLength ns = case ns of
[] -> 0
(x:xs) -> ( 1) (myLength xs)
或者
myLength ns = if null ns then 0 else ( 1) (myLength (tail xs)
如果[]情況匹配或者null as為真,那么遞回呼叫就不會進行。如果遞回呼叫是,注意xs是一個嚴格短于ns的串列(當ns是有限的),所以遞回將終止。(從某種意義上說,即使ns是無限的,xs也比ns短,但我不想在這里討論無限性的復雜問題。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316963.html
標籤:
