理解递归函数的定义

时间:2014-01-14 10:02:14

标签: haskell

您是否可以向我解释这些代码如何得出他们的答案?

pip = phi 4 where phi x = if x == 1 then 1 else 1+ phi (x - 1) * phi (x - 1)

返回结果26。

dpip = phi 5 where phi x = if x == 1 then 1 else 1+ phi (x - 1) * phi (x - 1)

这会返回677的结果。

也是一段类似的代码

plip = phi 4 where phi x = 1 + sum [ phi y | y <- [1.. (x-1)]]

返回8的结果,而

plips = phi 5 where phi x = 1 + sum [ phi y | y <- [1.. (x-1)]]

返回16的结果。

我真的不知道这些结果是如何实现的。

4 个答案:

答案 0 :(得分:5)

让我们分解它们

pip = phi 4 where phi x = if x == 1 then 1 else 1+ phi (x - 1) * phi (x - 1)

可分为两行

pip = phi 4

phi x = if x == 1 then 1 else 1+ phi (x - 1) * phi (x - 1)

第一行很简单,第二行是递归定义

phi 4 = 1 + phi 3 * phi 3
phi 3 = 1 + phi 2 * phi 2
phi 2 = 1 + phi 1 * phi 1
phi 1 = 1

替代链条

phi 1 = 1
phi 2 = 1 + 1 * 1 = 2
phi 3 = 1 + 2 * 2 = 5
phi 4 = 1 + 5 * 5 = 26

你的下一个问题只是向上走了一步

phi 5 = 1 + phi 4 * phi 4
      = 1 + 26 * 26
      = 677

类似的分析适用于第二段代码。

答案 1 :(得分:3)

我将解释第1和第3,然后从那里你应该能够弄清楚其余部分。

在我们正在调用的第一个代码段中

phi 4
1 + phi 3 * phi 3
1 + (1 + phi 2) * (1 + phi 2)
1 + (1 + (1 + 1) * (1 + 1)) * (1 + (1 + 1) * (1 + 1))
1 + 5 * 5
26

这仅仅是简单地扩展和简化。

第3次,

 phi 4
 1 + sum [phi 1, phi 2, phi 3]
 1 + sum [1, phi 2, phi 3]
 1 + sum [1, 2, phi 3]
 1 + sum [1, 2, 4]
 1 + 7
 8

答案 2 :(得分:2)

因此,在pip示例中,我们有以下定义:

phi x = if x == 1 then 1 else 1+ phi (x - 1) * phi (x - 1)

让我们对一些数字进行评估:

  1. phi 1 - 首先,我们检查x == 1,它是,所以我们返回1.因此phi 1 == 1
  2. phi 2 - 在这里,我们沿着else分支走下去。 x-1现在是1,我们知道phi 1的价值,因此我们得到phi 2 == 1+1*1 == 2
  3. 同样,对于phi 3,我们会得到phi 3 = 1+2*2 == 5
  4. 因此phi 41+5*5 == 26
  5. 对其他代码运行相同的分析。一般来说,原理是计算机下降堆栈直到达到基本情况,然后使用该基本情况上升堆栈以计算更高的答案。

    Here's一个关于programmers.stackexchange.com的问题解释了递归的概念,这似乎是你在这里挣扎的概念。

答案 3 :(得分:1)

如果你从头开始阅读它会更容易:

phi x = if x == 1 then 1 else 1+ phi (x - 1) * phi (x - 1)

这定义了一个递归函数phi;结果是

  

phi(1) - &gt; 1

     

phi(2) - &gt; 1 + phi(2-1)* phi(2-1)= 1 + phi(1)* phi(1)= 1 + 1 = 2

     

phi(3) - &gt; 1 + phi(3-1)* phi(3-1)= 1 + phi(2)* phi(2)= 1 + 4 = 5

     

phi(4) - &gt; 1 + 5 * 5 = 26

     

phi(5) - &gt; 1 + 26 * 26 = 677

plip函数中phi的定义使用for comprehension:

phi x = 1 + sum [ phi y | y <- [1.. (x-1)]]

将所有y的phi(y)值与1和x-1之间的值相加。