堆栈是一种逻辑结构,而不是数据结构。在这里填充堆栈并不严格。虽然很多地方的试卷给出的答案是stack,但我认为这里应该填写递归工作栈,即递归工作栈是用来存储被调用函数执行所需的数据,既有存储又有关系和操作,符合数据结构的定义。
哈哈,这种情况和我当时学编程一样。
首先,既然你可以问这个问题,我假设你已经看过一些递归程序的例子,而不是仅仅看定义来谈这个(如果你真的看不到,先去看看)
然后,在递归中,有一个非常重要的东西,那就是递归的退出条件,这是基础理解所有递归算法。递归必须有退出条件,否则程序将永远无法完成。退出条件是当递归程序运行到某个对象时,它不会继续调用自己。这个退出条件可以是递归的次数,也可以是判断某个数是否足够大,或者是否没有更多的子项,等等。通常,如果在递归函数中看到两个或多个返回(例如,如果返回xelse返回函数本身),那么不是返回函数本身的行就是退出条件。
找到退出条件后,剩下的就简单了。您可以将退出条件以外的部分拆分为完全相同的函数来理解它。例如,有一个递归函数f(intx),在return部分有一个句子是returnf(k),所以你重写它如下:
f1(intx),f2(intx),f3(intx)
函数体是一样的,只要复制f(intx),只要改变return,f1中原来的returnf(k)就变成了returnf2(k),而f2改为返回f3(k),简而言之,就是不断引入下一个要执行的函数。
然后您会发现函数体是相同的。为什么我要写这个函数n次,然后直接返回我自己
!如果你能在这里读到它,你已经可以理解它了。如果你不明白,就找一个例程打开自己写。
递归,其实是:从前有一座山,山顶有一座寺庙。庙里有个老和尚在讲故事。他在讲什么故事?他说:“从前有一座山
当整个故事达到5000字的时候,它就不会继续了。这5000字是退出条件。
理解经验是:1。不要跟着分析,先找到退出条件,这对理解算法为什么这样写很有帮助,递归只是一个过程。2当你不能理解程序时,把递归函数分成三个相同的函数,用迭代来连接。假设第三次达到退出条件,并且没有递归/迭代。在这种情况下,请再次理解。
但是,该算法没有考虑特定实现技术所消耗的额外运行时间和空间。最典型的算法是计算斐波那契序列f(n)=f(n-1)f(n-2)。在递归情况下,空间复杂度是恒定的。然而,在c/c中,消耗的内存空间大于o(n),而在其他编译器中,它可能是一个常数,而且算法非常纯。他只考虑算法所消耗的空间来存储所需或生成的数据。