
正文
c语言递归函数常见问题 c语言递归用法
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
c语言递归函数的问题?
#includestdio.h
void f(int a) { if ( a ) { f(a/10); printf("%d ",a%10); } }
void main() { int a; scanf("%d",a); f(a); printf("\n"); }
递归就好比 设计了一大堆同样的函数,每个函数名和定义的自用变量名都不同,互不冲突
主函数: f(a), a=23471
_f(a): a=23471, 因为a不等于0成立,执行f(a/10);并等待执行完毕后继续执行printf
__f1(a): a=2347,因为a不等于0成立,执行f(a/10);并等待执行完毕后继续执行printf
___f2(a): a=234,因为a不等于0成立,执行f(a/10);并等待执行完毕后继续执行printf
____f3(a): a=23,因为a不等于0成立,执行f(a/10);并等待执行完毕后继续执行printf
_____f4(a): a=2,因为a不等于0成立,执行f(a/10);并等待执行完毕后继续执行printf
______f5(a): a=0,因为a不等于0不成立,直接返回上一层调用者
_____f4(a): a=2,继续执行printf输出[2 ],返回上一层调用者
____f3(a): a=23,继续执行printf累计输出[2 3 ],返回上一层调用者
___f2(a): a=234,继续执行printf累计输出[2 3 4 ],返回上一层调用者
__f1(a): a=2347,继续执行printf累计输出[2 3 4 7 ],返回上一层调用者
_f(a): a=23471,继续执行printf累计输出[2 3 4 7 1 ],返回上一层调用者
main(): printf输出换行,结束
相关问答
Q1: c语言中有关递归函数的问题
需要注意的是 当被调用函数类型的 void 时, 不能用 return 。
所以建议您将这句void formatPrint(int num) 改为formatPrint(int num) 即,将 void 去掉 。
然后下边再用 return 语句 试试看。
希望对您有所帮助!
Q2: c语言递归问题
首先我们回答一下,你的这个题目中是有用到递归的。
我们先来了解下什么是递归:
递归的定义:直接或间接调用自己的函数成为递归函数(recursionfunction)。在求解某些具有随意性的复杂问题时经常使用递归,例如求解阶乘或者两个数的最大公约数等。因为这时解的具体“大小”不受限制,函数可以一直递归调用,直到问题解决。
递归的要求:递归函数必须定义一个终止条件;否则,函数就会“永远”递归下去,这意味着函数会一直调用自身直到程序栈耗尽,这种“永远”递归下去的现象叫做“无限递归错误”(infiniterecursion error)。
递归的特点:
1、在函数f()中,会对函数f()自己进行调用。
2、无限递归实际上是不允许的;递归函数必须定义一个终止条件,即什么情况下终止递归,终止继续调用自己,如果没有终止条件,那么函数将一直调用自己,知道程序栈耗尽,这时候等于是写了一个Bug!
3、 递归算法解题通常代码比较简洁,但不是很容易读懂。
4、 递归的调用需要建立大量的函数的副本,尤其是函数的参数,每一层递归调用时参数都是单独的占据内存空间,他们的地址是不同的,因此递归会消耗大量的时间和内存。而非递归函数虽然效率高,但相对比较难编程。
5、 递归函数分为调用和回退阶段,递归的回退顺序是它调用顺序的逆序。
如果以上对你有帮助,青采纳一下, 谢谢。
Q3: C语言,递归函数问题
return; 返回调用点c语言递归函数常见问题;
非递归c语言递归函数常见问题,返回调用他c语言递归函数常见问题的那个函数,调用他的那个地方;
递归调用,返回自己调用自己的地方,或者第一次调用他的地方,这个只有分析代码才知道具体情况。
无返回值函数,相当于,BASIC 的子程序,pascal 的过程,返回调用语句处,以便执行下一条语句,实际返回点是下一条指令,然后可能还要,再执行些,调用后的扫尾的工作,才来到下一步执行。
有返回值函数,返回使用函数值的地方。
不管哪一种,都是返回调用处,继续向下执行。
函数调用,首先要执行计算参数的任务,然后执行参数传递的工作,然后才轮到调用函数。
函数调用前,可能还要保存现场,具体就是寄存器压栈保存,防止函数调用时,现场被破坏
调用完成,要恢复现场,恢复寄存器的值,具体就是从堆栈中,弹出保存的寄存器数据值。
递归函数,一般包含c语言递归函数常见问题:
1)退出条件,适当条件下函数退出递归。
2)递归部分(自调用,并适当更新,执行条件,函数参数,全局变量等)
3)执行部分,如打印节点信息等。
看递归代码,
1)首先,看何时退出递归(程序不再执行自调用)
2)看递归执行顺序
3)看执行代码,干了什么。和递归部分的执行的先后顺序。
4)有些递归函数,没有独立的执行部分,只有一些表达式,看他先后执行那些表达式。
5)有些递归函数,只看函数本身看不出是递归函数,因为这个函数,会调用别的函数,别的函数又会再回头调用该函数本身。
这就要查看,函数调用链,里面是否调用了自己。
PSc语言递归函数常见问题:
不管是否递归,函数总是要干点什么的(函数的功能)。
所以,看递归函数,不能光看函数,自己调用自己的,递归部分;
还要看,非递归部分干了什么,这个部分,才是递归实际干的事情;
递归不过是一种重复而已,通过递归部分反复调用自己;
从而重复执行非递归部分,完成递归函数的功能。
C,C++ :return 语句有两个功能
1)返回调用处,程序执行下一步。
2)返回执行的结果
1)这个功能,返回的函数调用的位置,执行下步的程序。
在表达式中,函数调用会得到一个结果,程序解析表达式的时候遇到函数,会调用函数
代码执行,会因此跳到函数内部,开始执行函数内部的程序,执行完毕;
会得到一个结果,这个结果就是函数的返回值,也叫函数值,
这时函数调用就结束了,程序返回继续解析表达式,并用函数返回值代替函数,继续解析(计 算)表达式。
1) 如果表达式比较复杂的话;如果表达式解析没有完成,函数返回解析表达式的断点处,
如果完成了,执行下一条语句,
2)如果表达式比较简单,函数返回后,会执行下一条语句。
单独的一条函数调用,称为函数调用表达式。
所以,C 几乎一切都是表达式。
任何表达式,加上分号,就是一条语句。
所以 单独的函数调用加上分号,构成一条单独的函数调用表达式语句,就是函数调用语句。
函数调用语句,执行完成后返回调用点,执行逻辑上的下一条语句。
总结:
函数返回
1)返回值:函数返回值,放在特定的寄存器中(
X86,WINDOWS WIN32 VC eax---char,int 指针; edx:eax---long long,__int64;协处理器的浮点堆栈寄存器 float,double,long double :ST(0) ),如果返回值的类型,比较长,会使用一个全局变量(static???)存放返回值,并把该全局变量的指针,放在特定的寄存器中(X86,WINDOWS WIN32 VC:
eax)。
2)返回位置:函数结束,程序返回调用点。继续执行。
注意:由于函数可以用在表达式中,所以函数实际返回,解析表达式的断点处,继续解析表达式。
函数调用本身,就是一个表达式,称为函数调用表达式。
Q4: C语言递归函数问题
因为递归要存在一个最低层,这样才会有限,否则没有最低层的话,将会一直运行下去没有止境.
所以加个if
(n=1)表示他的最低层n的值是1,而根据你代码palin(i),n的最初值是i,也就是5,所以
第一层n的值是5,如果n的值大于1,那么就运行else里面的语句进入下一层palin(n-1)
第二层的时候n的值是上一层中的n-1也就是5-1=4
一直这样下去到n=1的时候运行if里的语句,里面不会再出现palin函数,就到达最底层.
然后运行完,逐层弹出去.
就是这样自己函数再读入自己函数,形成递归.
如果解释不明白
直接call我或者补充问题吧`
关于c语言递归函数常见问题和c语言递归用法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







