您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
递归不是函数调用自己,而是调用函数的另一个复制品。你认为呢?
递归,函数,堆栈递归不是函数调用自己,而是调用函数的另一个复制品。你认为呢?
发布时间:2020-12-06加入收藏来源:互联网点击:
递归不是函数调用自己,而是调用函数的另一个复制品。你认为呢?
回答于 2019-09-11 08:43:50
回答于 2019-09-11 08:43:50
你怎么认为都可以,你没走火入魔,只是想的太多了,你只要实现就可以了 ,不要管那么多,书读百遍其义自见,你现在读的太少了,读多了就行了。
回答于 2019-09-11 08:43:50
递归函数就是调用自己,程序运行的函数是一样的,只是每次调用都会分配新的栈内容,递归调用时一定要确保调用的终止条件,否则程序就挂了。
回答于 2019-09-11 08:43:50
請自學編譯原理
回答于 2019-09-11 08:43:50
从原理上来讲这个问题会涉及到数学与计算机的理论知识,并且难以理解,还是让我们以一个简单的实例来说明。
先看下面这个简单的求阶乘的程序,在计算5!的过程中,调用过程如下,可见fac函数虽然被调用了5次,但是每次传入的参数都不一样,返回的结果也各不相同。
再让我们看看这个递归程序在调用过程中的调用堆栈情况,选择调试模式,先在函数体内设置一个断点,当程序停在断点处时,可见调用堆栈中有5个fac函数,双击查看每个fac函数调用时局部变量情况,会发现每次的值与返回值都不一样。参考下面视频:
从上面例子可以看出,递归函数的每次调用都执行了同样的代码,但是因为传入的参数不一样,严格来说可以认为这两个函数不一样,所以说不是调用自己也算正确,实际上如果两个函数完全一样的话,递归就会陷入死循环而无法结束,直到耗尽内存而崩溃。至于说是调用复制品,则不够准确,因为函数的实现代码在计算机内存中只有一份,每次调用执行的都是同样的代码,所以并不存在另一个复制品。
那么递归调用是怎么实现的呢,实际上和一般的函数一样,简单来说就是把当前程序的状态压入堆栈(一种先进后出的数据结构),将参数放入特定的寄存器或者指定地址,然后跳转到被调用函数的入口,函数执行结束后从堆栈中恢复上一个状态,继续执行原来的程序。
最后对于递归函数有一点至关重要,那就是必须要有一个结束条件,并且是可达的,这样递归才会结束。否则递归将陷入死循环,再看一个这样的例子,现代编译器很智能,对于这样的问题会给出警告,如果忽略该警告,继续执行将会导致程序崩溃。
回答于 2019-09-11 08:43:50
用C写一小段,编译后看ASM就知道了。
回答于 2019-09-11 08:43:50
递归有两种方式实现,一种用系统堆栈,完全不管内存,每次调用就会生成一个新线程。一种用指针和本地堆栈保护断点,循环往复调用一个线程。
回答于 2019-09-11 08:43:50
递归调用也是一种函数调用,又分为自递归(同一函数自己调用自己)和互递归(不同函数之间互相调用形成递归)。
程序执行过程中,函数的代码是固定的,不会有什么变化,而相关数据会随着每次调用时的环境变化而不同,因此系统对函数执行时相应的数据进行管理。
象C、C++、Java等现代语言,每次函数调用时会申请一块内存来记录实参、局部变量、临时变量、返回地址等内容,退出时这块内存会释放掉。这样就做到同一函数的调用没有退出时又能启动另一个调用,也就能支持函数的递归这样的现代语言的特性。
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |