网站首页 > 文章中心 > 其它

C语言递归函数回溯

作者:小编 更新时间:2023-08-22 09:04:28 浏览量:277人看过

C++语言中的递归和回溯是什么意思?

菜鸟求助---C语言递归函数返回值

...

从汇编的角度来说,函数

返回值

,其实就是函数返回后,cpu中eax的值.在C语言等语方中,在函数中写了返回语句,那么函数在返回时,就会对eax作最后赋值.

int

find(int

a,int

b)

{

if(b=0)

return

①.00;

else

find(--a,--b);/这里为什么不用返回值?/

}

//为什么不用返回值呢,因为此程序进行递归后,在最初返回时,eax的值被赋值为100,而之后的回溯过程中,程序并没有修改eax的值,所以到最后,返回值还是100.

这种写法是会出问题的.应写成.

find(--a,--b);

为什么了修改之后就出错呢,如以上所说,这很好理解,因为程序最后调用了printf().eax中的值是printf()的返回值.若把他当成find()的返回值自然是出错了.

C的递归回溯问题

希望能帮到你..

首先 dep = 0 时,调用 f(0)

执行 else 中的 for 循环(i= 1)

used[1] = true;

a[0] = 1;

进入 dep = 1

dep=n,执行 if 中的 for 循环开始打印,第一次打印哦!!!!

返回到 dep = 1

返回到dep = 0

used[1] = false;

关于C++中的递归和回溯

返回机制应该在前,弄明白了返回机制递归才好理解

在调用一个函数的时候,编译器先把函数的参数从右自左压入栈中,然后用call指令跳至子过程地址,在跳之前会把当前代码所在的【段:偏移】地址压栈,当子过程执行完,会调用ret指令返回,ret指令和call相反当好是把栈中的【段:偏移】还原回寄存器(cs和ip),ret也就是C++的return关键字(当然,C++因为有重载机制,编译器会在压栈之前给所有的函数作签名改编,这是另一个话题),好了,全部的返回的原理.

弄明白了返回,递归就好理解了,假设从主函数调用一个子函数,这个子函数每次都对参数进行一些处理并递归,那么进入函数体后栈的状态是:参数、返回地址;那么在函数中又调用自己,栈就变成了:参数、返回地址、参数、返回地址;当满足了递归的退出条件时,ret一次,回到前一次自调用的地址,从这个地址开始,处理参数让栈顶停在返回地址处,然后ret......如此往复,直到回到调用子函数的函数体,以上的例子类似于:

void fun(int p)

if(p=1)//递归出口

return;

p--;

fun(p);

//这一步编译器实际上会pop ecx然后ret

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章