c语言中递归函数问题 c语言递归函数的例子( 三 )


会得到一个结果 , 这个结果就是函数的返回值,也叫函数值,
这时函数调用就结束了,程序返回继续解析表达式,并用函数返回值代替函数,继续解析(计算)表达式 。
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)返回位置:函数结束 , 程序返回调用点 。继续执行 。
注意:由于函数可以用在表达式中,所以函数实际返回,解析表达式的断点处 , 继续解析表达式 。
函数调用本身,就是一个表达式,称为函数调用表达式 。
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"); }
递归就好比 设计c语言中递归函数问题了一大堆同样c语言中递归函数问题的函数,每个函数名和定义c语言中递归函数问题的自用变量名都不同,互不冲突
主函数: 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输出换行,结束
c语言函数递归问题首先,我想说的是 。在写程序交流的时候,最好在算法后边标注一下算法所要实现的功能 。以便大家交流 。
我们从侧面来讨论这个问题 。首先,递归调用 , 就是函数在运行的过程中,不断调用他本身 。从而达到将问题的求解放到下一步去做 。而在最后的退递归的过程中,完成整个操作(退递归不要求一定理解)
既然是函数调用他本身 。为了防止无限制的调用下去 。所以我们在所有递归函数的开始处,都要有if语句,来判断是否当前已经满足了递归的终止条件 。如果是,返回一个确定的值 。(如本例中的return 3)
而不满足终止条件时,我们按照一系列相似的操作,来继续处理数据 。(如本例中的returnx-fun(x-2);

推荐阅读