F#递归地理解Fibbonacci序列

时间:2016-10-13 14:07:19

标签: math recursion f# fibonacci

这可能听起来像学校作业,但事实并非如此!

我做了一个递归函数,从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的吗?

2 个答案:

答案 0 :(得分:6)

计算FoneFive(6)需要计算FoneFive(5)FoneFive(4)
54n-1n-2n=6

计算FoneFive(5)需要计算FoneFive(4)FoneFive(3)
43n-1n-2n=5

计算FoneFive(4)需要计算FoneFive(3)FoneFive(2)
32n-1n-2n=4

计算FoneFive(3)需要计算FoneFive(2)FoneFive(1)
21n-1n-2n=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