您是否可以向我解释这些代码如何得出他们的答案?
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的结果。
我真的不知道这些结果是如何实现的。
答案 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)
让我们对一些数字进行评估:
phi 1
- 首先,我们检查x == 1
,它是,所以我们返回1.因此phi 1 == 1
。phi 2
- 在这里,我们沿着else
分支走下去。 x-1
现在是1
,我们知道phi 1
的价值,因此我们得到phi 2 == 1+1*1 == 2
。phi 3
,我们会得到phi 3 = 1+2*2 == 5
phi 4
,1+5*5 == 26
。对其他代码运行相同的分析。一般来说,原理是计算机下降堆栈直到达到基本情况,然后使用该基本情况上升堆栈以计算更高的答案。
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之间的值相加。