这可能听起来像学校作业,但事实并非如此!
我做了一个递归函数,从Fibonacci序列返回一个值。
let rec FoneFive n =
match n with
| 1 | 2 -> 1
| n -> FoneFive(n-1) + FoneFive(n-2)
printfn "%A" (FoneFive 6)
这个递归函数发生了什么? FoneFive 6
给出了应有的8。但为什么?
我看到它的方式:从n = 6开始,得出结论:6不是1或2.所以它调用FoneFive(n-1) + FoneFive(n-2)
。 (这可能是我弄错的地方。但我看到的方式是,除非n为1或2,否则不会返回任何内容。因此,从我的观点来看,它会缩小n = 1或2,然后说1 + 1当然是2。)
有人能告诉我它是如何返回8的吗?
答案 0 :(得分:6)
计算FoneFive(6)
需要计算FoneFive(5)
和FoneFive(4)
(5
和4
为n-1
,n-2
为n=6
计算FoneFive(5)
需要计算FoneFive(4)
和FoneFive(3)
(4
和3
为n-1
,n-2
为n=5
计算FoneFive(4)
需要计算FoneFive(3)
和FoneFive(2)
(3
和2
为n-1
,n-2
为n=4
计算FoneFive(3)
需要计算FoneFive(2)
和FoneFive(1)
(2
和1
为n-1
,n-2
为n=3
FoneFive(1)
和FoneFive(2)
都会返回1
所以FoneFive(3) = FoneFive(2) + FoneFive(1) = 1 + 1 = 2
所以FoneFive(4) = FoneFive(3) + FoneFive(2) = 2 + 1 = 3
所以FoneFive(5) = FoneFive(4) + FoneFive(3) = 3 + 2 = 5
所以FoneFive(6) = FoneFive(5) + FoneFive(4) = 5 + 3 = 8
答案 1 :(得分:0)
好的,我现在明白了。可以这么说,每当n不是1或2时,将它分成两部分,然后如果不是1或2,则再将它自身分成两部分。
f6 = f5 + f4
f5 + f4 = f4 + f3 + f3 + (f2=1)
f4 + f3 + f3 + (f2=1) = f3 + (f2=1) + (f2=1) + (f1=1) + (f2=1) + (f1=1) + 1
f3 + 1 + 1 + 1 + 1 + 1 + 1 = (f2=1) + (f1=1) + 1 + 1 + 1 + 1 + 1 + 1
(f2=1) + (f1=1) + 1 + 1 + 1 + 1 + 1 + 1 = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 = 8