我試圖了解遞回在haskell中的作業原理,我正在嘗試做一個使用總和相乘的函式
像 4 * 5 = 4 4 4 4 4
我目前的功能是
multiplicacao a b
| b == 1 = a
| otherwise = multiplicacao (a a) (b-1)
如果我嘗試做 multiplicacao 7 3 它回傳 28
uj5u.com熱心網友回復:
問題出在這里,您將遞回(a a)作為新值進行乘法運算。事實上,例如,如果你使用multiplicacao 7 3,你會得到:
multiplicacao 7 3
-> multiplicacao (7 7) (3-1)
-> multiplicacao (7 7) 2
-> multiplicacao ((7 7) (7 7)) (2-1)
-> multiplicacao ((7 7) (7 7)) 1
-> ((7 7) (7 7))
-> 14 14
-> 28
在每個遞回步驟中,您因此將a與相乘2并從中減去一個b,這意味著您正在計算a×2 b-1。
您應該保留原件a,因此每次都添加a到累加器中。例如:
multiplicacao :: (Num a, Integral b) => a -> b -> a
multiplicacao a = go 0
where go n 0 = n
go n b = go (n a) (b-1)
這僅適用b于自然數(零或正數)。
但是,您可以使用檢查b是偶數還是奇數的實作,在這種情況下它是偶數乘以a2。我把它留作練習。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/479389.html
下一篇:比較Haskell中的串列串列
