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


int n;
if(x16)
{
a[0]=t[x];
return 1;
}
n=hex(x/16,a);
a[n]=t[x%16];
return 1+n ;//这里为什么要是1+n?
}
----------------c语言中递归函数问题你的代码不对-------------------我改c语言中递归函数问题了一下c语言中递归函数问题!
1+n就是 返回高位的位置比如 2048那么应该就是 800
分析 16进来
if(x16)
{
a[0]=t[x];
return 1;
}
第一次x=2048不执行
n=hex(x/16,a);
if(x16)
{
a[0]=t[x];
【c语言中递归函数问题 c语言递归函数的例子】return 1;
}
第二次x=128不执行
n=hex(x/16,a);
if(x16)
{
a[0]=t[x];
return 1;
}
第三次x=8 a[0]=8;返回1
那么到第二次也就是128的这次 a[n]=t[x%16];n=1;结束后a=“80”
返回的是2 n+1啊
到2048的这次也就是第一次a[n]=t[x%16] n=2结束后 a=“800”
最后返回2+1 就是3
C语言,递归函数问题return; 返回调用点;
非递归,返回调用他的那个函数,调用他的那个地方;
递归调用,返回自己调用自己的地方,或者第一次调用他的地方 , 这个只有分析代码才知道具体情况 。
无返回值函数,相当于,BASIC 的子程序 , pascal 的过程 , 返回调用语句处,以便执行下一条语句 , 实际返回点是下一条指令 , 然后可能还要 , 再执行些 , 调用后的扫尾的工作,才来到下一步执行 。
有返回值函数 , 返回使用函数值的地方 。
不管哪一种,都是返回调用处,继续向下执行 。
函数调用,首先要执行计算参数的任务,然后执行参数传递的工作,然后才轮到调用函数 。
函数调用前,可能还要保存现场,具体就是寄存器压栈保存,防止函数调用时,现场被破坏
调用完成,要恢复现?。?恢复寄存器的值,具体就是从堆栈中,弹出保存的寄存器数据值 。
递归函数,一般包含:
1)退出条件,适当条件下函数退出递归 。
2)递归部分(自调用,并适当更新,执行条件 , 函数参数,全局变量等)
3)执行部分,如打印节点信息等 。
看递归代码,
1)首先,看何时退出递归(程序不再执行自调用)
2)看递归执行顺序
3)看执行代码,干了什么 。和递归部分的执行的先后顺序 。
4)有些递归函数,没有独立的执行部分,只有一些表达式 , 看他先后执行那些表达式 。
5)有些递归函数,只看函数本身看不出是递归函数,因为这个函数,会调用别的函数,别的函数又会再回头调用该函数本身 。
这就要查看,函数调用链 , 里面是否调用了自己 。
PS:
不管是否递归 , 函数总是要干点什么的(函数的功能) 。
所以 , 看递归函数,不能光看函数 , 自己调用自己的,递归部分;
还要看,非递归部分干了什么,这个部分,才是递归实际干的事情;
递归不过是一种重复而已,通过递归部分反复调用自己;
从而重复执行非递归部分,完成递归函数的功能 。
C,C++ :return 语句有两个功能
1)返回调用处 , 程序执行下一步 。
2)返回执行的结果
1)这个功能,返回的函数调用的位置,执行下步的程序 。
在表达式中 , 函数调用会得到一个结果,程序解析表达式的时候遇到函数 , 会调用函数
代码执行,会因此跳到函数内部,开始执行函数内部的程序,执行完毕;

推荐阅读