函数递归
递归定义:
程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的主要思考方式在于: 把大事化小
递归的必要条件:
- 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
- 每次递归调用之后越来越接近这个限制条件。
递归函数举例:
-
接受一个整型值(无符号),按照顺序打印它的每一位。
解析:
如输入1234,要使按顺序输出1 2 3 4
函数带入参数(1234)
由于1234不是单个数字,则进入向内层递 的过程(给1234/10)
再次带入参数(123)
由于123不是单个数字,则进入向内层递 的过程(给123/10)
再次带入参数(12)
由于12不是单个数字,则进入向内层递 的过程(给12/10)
再次带入参数(1)
由于1是单个数字,则进行打印并向外层归 的过程。
代码:
#include <stdio.h>
void print(int n) {
if(n>9)
{
print(n/10);
}
printf("%d ", n%10);
}
int main()
{
int num = 1234;
print(num);
return 0;
}
-
求第n个斐波那契数
斐波那契数解释:
斐波那契数列指的是这样一个数列
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…
第0项是1,第1项是1
从第三项开始每一项都等于前两项之和。解析:
判断所求的第n个斐波那契数的n是否为0,为0则返回1,
判断所求的第n个斐波那契数的n是否为1,为0则返回1,
若n不为0,也不为1,则第n个等于第n-1加第n-2。代码:
int fib(int n)
{
if (n <= 2)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
但fib函数因为没有临时保存,在调用的过程中一直重复很多计算, 如求第5个时,需要第4和第3,就需要重新求4和3,大大降低效率。因此需要修改代码将其改成非递归,以此减少代码运行次数:
int count=0;//标识递归代码找n时运行了多少次
int fib(int n)
{
if(n==3)
count++;
if(n<=2)
return 1;
else
return fib(n-1)+fib(n-2);
}
非递归代码:
int fib(int n)
{
int result;
int pre_result;
int next_older_result;
result = pre_result = 1;
while (n > 2)
{
n -= 1;
next_older_result = pre_result;
pre_result = result;
result = pre_result + next_older_result;
}
return result;
}
注意点:
- 许多问题用递归的形式进行解释,是因为它比非递归更为清晰。
- 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。
- 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销。
来源:CSDN
作者:顾江西
链接:https://blog.csdn.net/Nakahara_Chuya/article/details/104736508