2015-09-05 92 views
1

我想了解Haskell中的遞歸。我想用下面的屬性寫一個簡單的遞歸函數:if x > 50 then rec(x) = x - 5 and rec(x) = rec(rec(x+10)) otherwise otherwise。 這是我想出了:Haskell中的簡單遞歸

rec x = if x > 50 
    then x-5 
    else rec (rec (x+10)) 

的不遞歸部分似乎做工精細,但遞歸沒有。每個小於50的數字只返回50.例如rec 60 = 55rec 40 = 50rec 25 = 50

有關如何解決我的代碼的任何建議,將不勝感激。

+2

提示:嘗試'rec 26'。 – duplode

+0

與你的問題無關,但我會看守衛。他們會讓你的功能更清潔(主觀)。 – Carcigenicate

+1

我也會提倡守衛('rec x | x> 50 = x - 5'),然後我建議你也解釋一下你期望函數返回的原因,因爲對我來說它似乎工作正常。 – jakubdaniel

回答

3

對於x <= 50,你的功能等同於:

rec' x = if x `mod` 5 == 0 
     then 50 
     else 45 + x `mod` 5 

這可以通過運行一個簡單的測試來檢查:

all (\ x -> rec x == rec' x) [0..50] 

因此,你需要養活的輸入這是不5的倍數以得到與50不同的答案。