本章将以斐波拉契数列的两种实现方式来学习递归与迭代。

注:斐波拉契数列,第三个数是前两个数之和。

1,1,2,3,5,8,13,21,34..........

1.以递归方式求第n个斐波拉契数列的值。

实例

​int Fn(int x)

{

if (x <= 2)

return 1;

else

return Fn(x - 1) + Fn(x - 2);


}


int main()

{

int n;

scanf("%d", &n);

int ans = Fn(n);

printf("%d\n", ans);

return 0;

}

我们直接拿出函数来看:

int Fn(int x)


{
if (x <= 2)

return 1;

else

return Fn(x - 1) + Fn(x - 2);
}

这个逻辑很简单

1)x取1或者2时,函数返回值取1.

2)取出大于2的x值,直接用递归表达式

Fn(x - 1) + Fn(x - 2),直至x-2或者x-1中的某一个减小到小于2时,得到返回值1,然后再分别叠加出来。


但是每执行一次return的表达式,就会产生两个临时的内存空间存储Fn(n-1)和Fn(n-2),造成内存浪费,实际执行时代码效率很低。

2.以循环方式求第n个斐波拉契数列的值。

​int Fn(int x)

{

int a,b = 1;

int c,i = 0;

if (x <= 2)

return 1;

for (i = 3; i <= x; i++)
{

c = a + b;

a = b;

b = c;

}
return c;
}



int main()

{

int n;

scanf("%d", &n);

int ans = Fn(n);

printf("%d\n", ans);

return 0;

}

这段代码没甚么可说的,实现起来非常简单。但考虑自增量是否有些多余?

于是尝试用while循环用参数的自增减实现。

这里仅给出函数定义式:

while形式

int Fn(int x)
{
int a = 1;
int b = 1;
int c = 0;
if (x <= 2)
return 1;
while (x > 2)
{
c = a + b;
a = b;
b = c;
x--;
}
return c;
}

for形式

int Fn(int x)
{
int a = 1;
int b = 1;
int c = 0;
if (x <= 2)
return 1;
for (; x > 2; x--)
{
c = a + b;
a = b;
b = c;
}
return c;
}

没甚么技巧可言,很基础的练习题。

今天学会了此类博客的代码书写方式,也是一种收获。静默第二天,感觉尚可。