函数的递归与迭代(day10)
原创
©著作权归作者所有:来自51CTO博客作者蓝色fufu的原创作品,请联系作者获取转载授权,否则将追究法律责任
本章将以斐波拉契数列的两种实现方式来学习递归与迭代。
注:斐波拉契数列,第三个数是前两个数之和。
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;
}
没甚么技巧可言,很基础的练习题。
今天学会了此类博客的代码书写方式,也是一种收获。静默第二天,感觉尚可。