目录
- 前言
- 一、 函数递归
- 二、 函数递归的条件
- 三、函数递归的过程分析
- 四、函数递归的例题
- 结语
前言
生活中的问题是复杂多变的,有些问题看似复杂、繁琐、无从下手,但仔细分析,又会发现问题可以分解成为若干个小问题,而每一个小问题又有着相似之处,此时我们不妨想想能否用函数的递归来解决问题。
一、 函数递归
什么是函数递归(recursion)?
函数递归就是指函数直接或简洁调用自己的过程。
二、 函数递归的条件
如上图一可以看到,如果函数直接进行递归调用,那么调用过程就会一直进行下去,导致程序无法停止,这显然是不允许的,所以,函数的递归必须又限制条件。
1.有一个或多个终止状态,且存在限制条件,当条件满足终止状态时,必须停止递归。
2.限制条件必须在每一次递归调用后越来越接近终止状态。
总结起来就算是四个字:大事化小
如果以上条件不满足其中一个,而去使用递归的话,就会出现死递归。简称:“死龟”啦!
三、函数递归的过程分析
我们通过函数递归来计算给定正整数n的阶乘来分析。
补充:阶乘就是从1一直累乘n本身
即:1 * 2 * 3 * ……* n
我们通过代码和画图来分析
#include<stdio.h>
//定义一个用于递归的函数
int f(int n)
{
if (1 == n)
return 1;
else
return n * f(n - 1);
}
int main()
{
int n = 0;
int sum = 1;
scanf("%d", &n);
printf("%d", f(n));//将输入的n传入函数,并将函数的返回值打印出来
return 0;
}
由此可见,函数递归,一定是要递归到函数不再满足递归的条件,才能使函数一步一步返回的
每一次调用函数,一定要等待下一次调用的函数返回并销毁后,该次调用的函数才会返回和销毁
若递归的次数过多,则会使程序效率变慢,甚至会因为压栈而造成程序异常
所以,虽然递归有时候解决问题很方便,但我们一i定要学会控制好递归的次数和条件。
四、函数递归的例题
用递归的方法打印一个整数的每一位
#include<stdio.h>
void f(int n)
{
if (n > 9)
{
f(n / 10);//如果n有两位数字及以上,则调用f(n/10),再打印最后那一位数字。
}
printf("%d", n % 10);
}
int main()
{
int n = 0;
scanf("%d", &n);
f(n);
return 0;
}
到此,函数递归的内容也就结束啦,希望能够对同学们有所帮助。
结语
创作不易,希望大家可以点赞、评论、转发、关注一条龙哦!
你们的支持是我创作最大的动力!!
由于本人能力有限,若有错误,希望指正!!
如果有更好的方法或者想法,也欢迎再评论区留言哦~