本章讲解的是函数的递归,因为递归函数是解决复杂问题的最重要的方法之一,我们在学习算法的过程中会遇到他,所以我想对它做一个讲解,希望能帮助到别人,也能帮助自己整理一下。下面,我将解释一些主题来理解递归函数。
前言:
首先,什么是递归?递归是指定义一个函数,然后在函数中调用该函数。一般来说,函数调用自己。那么递归有什么好处呢?可以用少量的代码表达复杂的问题,提高了代码的可读性。
但是递归有一个条件,就是每次重复调用都需要更接近这个限制。
1.用递归打印一个整数的每一位
题目的要求是打印整数的每一位,比如1234。打印的结果是1234。我们已经学会了用循环来打印4321,但是和递归相比,用循环来打印会有点复杂。
# includes dio . h//使用递归打印整数的每一位
打印(整数)
{
int I=0;
如果(n9)
{
打印(n/10);
}
printf(“% d”,n);
}
int main()
{
int num=0;
Printf('请输入一个整数:');
scanf('%d ',编号);
打印(数字);
返回0;
}
这个问题利用了递归的思想,递归函数就是打印函数。
首先是递归中的“通”。
当我们在scanf函数中输入一个整数1234时,第一次进入打印函数,通过if语句再次进入打印函数。注意,printf还没有打印出结果。
第二次进入打印功能。这时候进入函数的数字不是1234,而是十之后除以123。进入打印函数后,通过if语句再次进入打印函数。请注意,此时printf还没有打印出结果。
第三次进入打印函数,12除以10后还是大于9,于是通过if语句再次进入打印函数,然后除以10后用1进入打印函数。注意,printf还没有打印出结果。
第四次调用打印函数时,此时n为1,显然不满足大于9的条件。这时1比10多的结果还是1,所以先打印出1。
然后就是递归中的“返回”。
打印完1,第四次进入循环的过程就结束了。这时,我们回到上一个循环。我们知道最后一个循环在进入if语句后没有再往下走。当我们回去的时候,我们将继续上一个操作,运行下来,打印12次以上的结果2。同样,我们将打印最终的1234。
2.递归求n的阶乘
你还记得上一次求n的阶乘还是上一次。这次用递归求解n的阶乘其实很简单。首先,写一个求n的循环,不用递归。
# includes dio . h//求n的阶乘。
int main()
{
int num=0;int I=0;int ret=1;
Printf('请输入一个值:');
scanf('%d ',编号);
for(I=2;i=num我)
{
ret *=I;
}
printf('%d ',ret);
返回0;
}
然后递归求n的阶乘:
# includes dio . h//求n的阶乘。
整数因子(整数n)
{
如果(n ^ 1)
返回n * fac(n-1);
其他
返回1;
}
int main()
{
int ret=0;
int num=0;
Printf('请输入n的值:');
scanf('%d ',编号);
ret=fac(num);
printf('%d ',ret);
返回0;
}
这时,of的n就是输入值,fac(n-1)反复调用这个函数,可以无限接近n大于1的条件。这使用了递归的思想。我们知道求n的阶乘也可以表示为n乘以(n-1)的阶乘。重复这个过程,当n-1等于1时停止。达到求n的阶乘的目的~ ~
3.用递归和非递归求字符串的长度
求字符串的长度不是strlen函数吗?
但是不使用这个库函数呢?
我们还是可以用两种方法解决。
首先用非递归求字符串的长度,也就是用我们自己的my_strlen函数。
# includes dio . h//用非递归查找字符串的长度
my_strlen(char *arr)
{
int a=0;int ret=0;
char c=*(arra);
while(arr[a]!='\0')
{
a;
ret
}
返回ret
}
int main()
{
int ret=0;
char arr[]=' ABC ';
ret=my _ strlen(arr);
printf('%d ',ret);
返回0;
}
递归如下:
# includestdio.h
my_strlen(char* arr)
{
int I=0;
if (*arr=='\0 ')
返回0;
if (*arr!='\0')
返回1 my _ strlen(arr 1);
}
int main()
{
int ret=0;
char arr[]=' ABC ';
ret=my _ strlen(arr);
printf('%d ',ret);
返回0;
}
这个问题的思路是一个一个数字符,直到\0结束程序。我们知道“abc”由四个字符abc\0组成,递归的思想是先数字符A,再数B,直到\0结束。
4.输入一个数求各位数之和
这道题的意思是求一个百位数的整数之和,比如1234结果是10;
# includes dio . h//输入一个数字以查找数字的总和。
sum(int x)
{
int ret=0;
如果(x ^ 9)
{
返回x % 10 sum(x/10);
}
其他
返回x;
}
int main()
{
int num=0;
Printf('请输入数字的总和:');
scanf('%d ',编号);
printf('%d ',sum(num));
返回0;
}
5.用递归求n的k次方
# includes dio . h//用递归求n的k次方
tmp(int x,int y)
{
如果(y=0)
{
返回1;
}
其他
返回x * tmp(x,y-1);
}
int main()
{
int k=0;int n=0;
Printf('请输入一个n和k:');
scanf('%d %d ',n,k);
int ret=tmp(n,k);
printf('%d ',ret);
返回0;
}
6.计算斐波那契数
# includes dio . h//计算斐波那契数
费博纳(整数)
{
如果(n=3)
返回费博纳(n - 1)费博纳(n-2);
else 1;
}
int main()
{
int n=0;
Printf('请输入一个n:');
scanf('%d ',n);
int ret=Fei bona(n);
printf('%d ',ret);
返回0;
}
斐波那契数列是1 1 2 3 5 8 13.前两个数之和得到第三个数。
下面是一个没有递归的解决方案:
# includes dio . h//用非递归查找斐波那契数\
int feibona(int N)
{
int I=1;
int j=1;
int sum=I j;
for(I=4;I=N;我)
{
I=j;
j=总和;
sum=I j;
}
返回总和;
}
int main()
{
Printf('请输入一个n:');
scanf('%d ',n);
int ret=Fei bona(n);
printf('%d ',ret);
返回0;
}
结论:
这些都利用了递归函数的求解方法,思路也差不多。如果你仔细琢磨,你会发现递归的魅力。这些例子可以用来复习。欢迎支持和喜欢你的收藏~ ~
关于深入理解C语言中函数递归的这篇文章到此为止。关于C语言中函数递归的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。