扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
C语言函数可以自我调用。如果函数内部一个语句调用了函数自己,则称这个函数是“递归”。递归是以自身定义的过程。
连云港网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设等网站项目制作,到程序开发,运营维护。创新互联公司公司2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司。
这是递归运算,当运行到age(n-1)时,会将n-1的值传递到age函数中再执行此函数,此时age(int n)中的n就等于n-1;下面的依次循环,直到n==1,执行顺序如下:
n=5时,运行到age(4)+2,此时调用age(4),
n=4,运行到age(3)+2,此时调用age(3),
n=3,运行到age(2)+2,此时调用age(2),
n=2,运行到age(1)+2,此时调用age(1),
n=1时,c=10,return c 即返回10.现在将10返回到调用age(2)时的age(1)+2,即c=age(1)+2
c=12,再return 12,返回到调用age(3)时的age(2)+1,c=age(2)+2,此时c=14,····这样一直返回到n=5的情况,此时c=18
}
区别:
函数的嵌套调用是指在一个C语言函数里面在执行另一个函数,这样通常称为函数的嵌套调用。而函数的递归调用,一般指的是这个C语言函数调用自己本身的函数也就是说调用函数的函数体是一样的,这样称为递归调用。
扩展资料:
函数的分类
从用户使用的角度看,函数有两种:
标准函数,即库函数。这是由系统提供的。用户自定义的函数。可以解决用户的专门需要。
从函数的形式看,函数分两类:
无参函数。printstar和print_message就是无参函数。在调用无参函数时,主调函数并不将数据传送给被调用函数,一般用来执行指定的一组操作。
有参函数。在调用函数时,在主调函数和被调用函数之间有数据传递。也就是说,主调函数可以将数据传递给被调用函数使用,被调用函数中的数据也可以带回来供主调函数使用。
参考资料来源:百度百科—main函数
函数在C语言中是必不可少的一部分,大致可以分为两种:系统定义好的和我们自己写的。不管是哪种函数,它们都默默地、兢兢业业地完成着属于自己的任务。只要给它一些参数,它就会把参数处理好、有些函数还会把处理结果返回出来。以下几种特殊函数,你有见过吗?会用吗?
1、静态函数
普通的函数一般是全局的,可见范围是跨文件的,比如a.c 这个文件中有一个函数名为 func() , b.c文件 中是可以直接调用a.c中的func函数的。而静态函数不同,它被static修饰之后可见范围缩小到本文件可见,其它文件不可见。
如果真的是闲得蛋疼想在一个文件中调用一个别的文件中的静态函数,也有办法:
1.直接把func所在的函数包含进来 #include "b.c"
2.可以把static 修饰的函数写在头文件中
2、递归函数:
这个名字看起来有一点数学味,比较高级的样子。其实它的定义也很简单:在一个函数内部调用了自身,那这个函数就是递归函数。
下面写了一个例子:
使用递归函数的时候有几个问题要注意:
1.只有能被递归解决的问题才可以使用递归来解决。(阶乘、幂运算、字符翻转等)
2.递归函数中必须有一个可以直接退出(返回)的条件,否则会进入无限循环。
3.递归的过程包含两个:逐渐递进,层层回归。
4.递归函数会使用大量的栈内存空间,要注意递归的层次不要太深,如果一定要用的话可以尝试把栈空间的大小临时设置一下。(ulimit -s)
3.指针函数
这种函数是什么其实很明显了,指针函数就是返回值是指针类型的函数。
使用的时候要确保该函数的返回值是指针,不然编译器会报警告。
4、回调函数
函数的实现方,它不方便直接调用该函数,而是由第三方接口来调用该函数,该函数就是回调函数。概念有点绕,我们直接看代码:
可以看到我们在主函数main里面并没有直接调用func()函数,而是运用函数指针P通过一个signal函数去调用它。在实际工程中回调函数会用得比较多,就像图中的signal函数,假设这个函数是从别人手上买回来的,我们无权访问其源码,只能够使用。卖家给我们留下了接口让我们使用它,因此我给了它两个参数,当它收到信号2的时候,我希望它能帮我调用我写的func()函数。那么func()就是所谓的回调函数。
5、内联函数
如果有一个函数被多次调用,那么该函数在调用过程中会消耗程序执行的时间, 而内联函数指的就是可以把需要调用的函数副本拷贝到调用者的内部,节约了调用过程中的时间。
普通函数的调用与切换过程:
内联函数示意图:
内联语法:
什么时候应该用内联函数:一个函数在另一个函数多次被调用,而且被调用函数的内容比较少的情况。
6、变参函数
如果一个函数的参数类型以及参数的数量都是可变的,那么这个函数就称之为变参函数(如我们常用的printf)。
函数形参在栈中分配内存的顺序,从右到左的独特顺序使得第一个参数是栈顶元素(即示例中的参数 format),我们就可以根据第一个已知的参数(绿色)所提供的线索, 来回溯剩下的未知的参数(黄色)
以上六种特殊函数,你看懂了吗?有任何疑问可以评论区告诉我哦!
森式嵌入,持续分享嵌入式硬知识。欢迎志同道合的朋友关注一起交流进步!
楼主的程序有两处错误,给你修正了一下:
局部两边x没有引用,给你删掉
main函数没有定义类型,加void
#include stdio.h
void fun(int n)
{
int d,y;//x给你删掉了
d=n%2;
y=n/2;
if(y!=0)
{
fun(y);
}
printf("%d",d);
//putchar('\n');这个没用我给你注释了
}
void main()
{
int n;
printf("enter a number\n");
scanf("%d",n);
if(n0)
printf("Input data error\n");
else
fun(n);
putchar('\n')//最后才调用这句代码
}
下面给你分析一下:
fun()函数是一个递归函数,什么意思呢?意思就是它会调用本身,每次函数都会先执行代码d=n%2;y=n/2;然后在判断n是否大于0,如果n大于0,函数继续回调,如果n=0,函数就结束了回调,整个程序也就完成了。
至于你说的执行完了这句还会不会执行后面的printf("%d",d);这是肯定的,因为要输出啊,给你看看运行结果
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流