2015-09-05 93 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不同的答案。