目录
一、函数递归的概念
1.概念
递归即函数调用自身的编程技巧,即自己调用自己。递归,有递有归,递即递推,归即回归。先递后归。
少量多次的重复计算使用递归可以大大减少代码量。
关键目的:把大事化小。
2.必要条件
存在限制条件,当满足限制条件时,递归不再继续;
每次递归调用后都越来越接近这个限制条件。
注:若没有限制条件,则会一直调用,导致栈溢出
例如:
#include <stdio.h>
int main()
{
printf("haha\n");
main();
return 0;
}
二、函数递归的应用举例及解释
1.计算n的阶乘
#include <stdio.h>
int factorial(int n)
{
if (n == 1)
{
return 1;//1的阶乘等于1
}
return n * factorial(n - 1);//每个大于1的数的阶乘都等于该数与上一个数的阶乘相乘
}
int main()
{
int num = 0;
scanf("%d", &num);
int x = factorial(num);
printf("%d\n", x);
return 0;
}
假设num=5,则 5!=5*4!=5*4*3!=5*4*3*2!=5*4*3*2*1 =120
即5!=5*factorial(4) =5*4*factorial(3) =5*4*3*factorial(2) =5*4*3*2*factorial(1) =5*4*3*2*1 =120
此题中的“递” 体现在层层调用,直至n=1时返回1,然后再层层回归,每个函数的返回值依次回归,得到5!=120。
2.依次打印输入数的各位数
#include <stdio.h>
void print(int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10);//打印结果为顺序
//若printf语句在if前面,则打印出来的结果为逆序
}
int main()
{
int num = 0;
scanf("%d", &num);
print(num);
return 0;
}
当n>9(即输入的数不是个位数)时,调用print函数本身,参数为原始形参/10,越来越靠进个位数,直至参数<=9时,打印该参数%10;打印之后原路返回(回归),依次打印上一个print函数中的n%10,直至最开始的print函数,结束。
假设输入的数为1234,则依次调用print(1234),print(123),print(12),print(1),当形参为1时,不再继续调用该函数,而是执行print(1)中的printf语句打印1,而后回归至函数print(12)中的if语句(已经执行完毕),然后执行printf语句打印2,。。。依次类推,直到执行print(1234)printf语句打印4,函数调用结束,屏幕上依次打印出了1 2 3 4,达到题目要求。
本文含有隐藏内容,请 开通VIP 后查看