递归到非递归转换:计算fun1值的非递归算法

需积分: 46 3 下载量 178 浏览量 更新于2024-07-13 收藏 222KB PPT 举报
本资源主要探讨了计算函数fun1(5)的值,通过递归算法的转换为非递归算法的过程。递归是一种编程技术,其中函数或过程会调用自身来解决更小规模的问题,直到达到基本情况,然后逐步构建出整体解决方案。在这个例子中,递归的核心思想是将问题分解成相似但规模较小的子问题,并存储在栈中进行处理。 6.3节重点讲述了递归算法到非递归算法的转换方法。当遇到一个递归问题时,首先要理解其递归定义,如例中的阶乘函数(n!)的递归定义。递归函数`factorial(n)`通过不断调用自身,直到n等于0(基本情况)停止。非递归实现则需要借助栈数据结构,将递归调用转化为顺序执行,例如将`(n, *, 1)`放入栈中,然后在while循环中检查栈顶元素,根据其是否已经计算出vf值来决定执行计算或进一步分解子问题。 递归的使用通常在以下几种场景:当问题的定义本身就是递归的,如Fibonacci数列的定义;数据结构是递归的,如单链表的节点类型定义,采用递归算法便于处理;或者问题本身的求解方法就是递归的,例如求链表所有元素之和。 在计算fun1(5)的过程中,栈的作用至关重要。当栈不为空时,程序会检查栈顶元素的状态,如果还未计算vf值,就根据规则计算并标记为已计算。如果栈顶元素的vf值已经计算过,那么它是由次栈顶元素通过递归关系得到的,此时会反向计算次栈顶元素的vf值并从栈中移除。最后,当栈中只剩下一个已计算vf值的元素时,fun1(5)的值就被找到,即为`St[0].vf`。 总结来说,这个资源提供了将递归算法转换为非递归算法的具体步骤,强调了递归在解决复杂问题中的应用以及如何通过栈的数据结构来模拟递归过程,这对于理解和实现非递归算法以及优化递归性能具有重要意义。