前言
本篇文章叙述函数的递归和迭代。
一、函数递归
1.1 什么是递归
程序调用自身的编程技巧称位递归,是函数在定义过程中调用自身的一种解决问题方法。
递归的思路是将一个复杂问题转化为一个与原问题相似的规模较小的问题去求解。
递归的主要思考方式:大事化小
1.2 使用递归的两个条件
- 存在结束条件,当问题规模小到一定程度时,结束递归
- 每递归一次,都会缩小问题的规模
1.3 递归函数例子演示
问题:输入一个无符号整数值,按顺序打印每一位
例如输入1234,则打印 1 2 3 4
代码如下:
// %d 打印int
// %u 打印unsigned int
void print(unsigned int n)
{
if (n > 9) //递归结束条件
{
print(n / 10);//缩小问题规模
}
printf("%u ", n % 10);
}
代码分析过程如图1.3所示:
二、迭代
迭代是指通过前面计算的结果一步一步的计算出最终的结果。循环是实现迭代的一种方式。
下面通过斐波那契数列问题比较递归和迭代,公式如图2.1所示
递归实现,代码如下:
//递归实现
int Fib(int n)
{
if (n > 2)
return Fib(n - 1) + Fib(n - 2);
else
return 1;
}
问题:存在大量的重复计算,容易导致栈溢出。
迭代实现,代码如下:
//迭代实现
// 1 1 2 3 5 8 13
// a b
// 1 1 2 3 5 8 13
// a b
int Fib(int n)
{
int a = 1; //n-2的斐波那契数
int b = 1; //n-1的斐波那契数
int c = 1; //n的斐波那契数
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}