我對Haskell來說很新,所以對於這個問題抱歉。但是 - 如何擺脫無盡的遞歸,並沒有被超越。這是代碼:Haskell遞歸堆棧溢出
foo :: Integer -> Integer
foo x
| x == 1 = 1
| x <= 0 = error "negative number or zero"
| odd x = foo 3 * x + 1
| x `mod` 2 == 0 = foo x `div` 2
| otherwise = x
編輯:
foo :: Integer -> (Integer, Integer)
foo x
| x == 1 = (1, z)
| x <= 0 = error "negative number or zero"
| odd x = foo (3 * x + 1) . inc z
| even x = foo (x `div` 2) . inc z
| otherwise = (x, z)
where z = 0
inc :: Integer -> Integer
inc i = i + 1
我相信代碼是不言自明,但尚未:如果x是偶數然後將其劃分2另有3 * X +這是着名的Collatz問題的一部分。
您也可以使用'even'代替'國防部2'測試。而且看起來你的'否則'情況永遠不會達到。 –
在你的編輯中,像'f x。 g y'同夥喜歡'(f x)。 (g y)'而不是'(f x。g)y',因爲函數應用程序的綁定比任何運算符都要緊密。你可以在這裏使用'$'(實際上,你可能將'$'與'''混合在一起),但是你也可以使括號明確,而不是使用'。'或'$'。 –