2014-01-14 78 views
0

嗨,任何人都可以向我解釋這些代碼是如何得出他們的答案的?瞭解遞歸函數的定義

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的結果。

我真的不知道這些結果是如何實現的。

回答

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 

類似的分析適用於第二一段代碼。

+2

感謝克里斯,我實際使用您的佈局很好的答案,以及如何在計算機第一次下降棧找到基本情況Impredicative的解釋,於是在迴歸的方式從那裏向上從先前的「phi」中得出結果來計算下一個結果。有了這些見解,我就能夠弄清楚第二段代碼是如何工作的。 – GunnerGunn

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

對其他代碼運行相同的分析。一般來說,原理是計算機下降到堆棧,直到達到基本情況,然後使用該基本情況升高堆棧以計算更高的答案。

Here's關於programmers.stackexchange.com的一個問題,解釋了遞歸的概念,這似乎是你在這裏掙扎的概念。

1

如果從最終讀它很簡單:

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

定義一個遞歸函數phi;結果是

披(1) - > 1

島(2) - > 1 +披(2-1)*披(2-1)= 1 +披(1)*披(1)= 1 + 1 = 2

phi(3) - > 1 + phi(3-1)* phi(3-1)= 1 + phi(2)* phi(2)= 1 + 4 = 5

島(4) - > 1 + 5×5 = 26

披(5) - > 1 + 26 * 26 = 677

用於PLIP函數內披定義使用爲理解:

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

此求和值披(y)的所有個Y 1和x 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