数据结构:利用栈,将递归转换为非递归的方法
利用棧將遞歸轉(zhuǎn)換為非遞歸
對于一般的遞歸過程,仿照遞歸算法執(zhí)行過程中遞歸工作棧的狀態(tài)變化,可直接寫出相應(yīng)的非遞歸算法。
步驟
第一次調(diào)用的參數(shù)push進(jìn)堆棧,原有遞歸代碼外層加一個while循環(huán),判斷條件就是遞歸結(jié)束的條件。遞歸調(diào)用的地方改成push(); continue;
直到遇到遞歸終止條件,退出遞歸運算所在循環(huán),再用一個新的循環(huán)做出棧操作并計算,將遞歸代碼中的return改成pop并執(zhí)行響應(yīng)的計算,直到棧空為止。就可以了。
完整描述:
(1) 設(shè)置一個工作棧存放遞歸工作記錄(包括實參、 返回地址及局部變量等)。
(2) 進(jìn)入非遞歸調(diào)用入口(即被調(diào)用程序開始處) 將調(diào)用程序傳來的實參和返回地址入棧(遞歸程序不可以作為主程序,因而可認(rèn)為初始是被某個調(diào)用程序調(diào)用。
(3) 進(jìn)入遞歸調(diào)用入口:當(dāng)不滿足遞歸結(jié)束條件時,逐層遞歸,將實參、 返回地址及局部變量入棧,這一過程可用循環(huán)語句來實現(xiàn)一模擬遞歸分解的過程。
(4) 遞歸結(jié)束條件滿足,將到達(dá)遞歸出口的給定常數(shù)作為當(dāng)前的函數(shù)值。
(5) 返回處理:在棧不空的情況下,反復(fù)退出棧頂記錄,根據(jù)記錄中的返回地址進(jìn)行題意規(guī)定的操作,即逐層計算當(dāng)前函數(shù)值,直至棧空為止一模擬遞歸求值過程。
通過以上步驟,可將任何遞歸算法改寫成非遞歸算法。但改寫后的非遞歸算法和原來比較起來,結(jié)構(gòu)不夠清晰,可讀性差,有的還需要經(jīng)過一系列的優(yōu)化。
代碼示例
設(shè) n 為大于等于 0 的整數(shù),利用堆棧設(shè)計下列函數(shù)的非遞歸算法。(天津大學(xué),2006)
下面將給出一種遞歸解法、四種非遞歸解法,供參考。
import java.util.Stack;public class Recursion {public static void main(String[] args) {// 測試用例for (int i = 0; i < 20; i++) {System.out.println(recursion(i));System.out.println(non_recursion1(i));System.out.println(non_recursion2(i));System.out.println(non_recursion3(i));System.out.println(non_recursion4(i));System.out.println("=====");}}/*** 使用遞歸*/public static int recursion(int n) {if (n == 0) {return 1;} else {int b = n / 2;int res = recursion(b);return n * res;}}/*** 非遞歸方法1:利用棧,雙參數(shù)*/public static int non_recursion1(int n) {class Node {int a;int b;}Stack<Node> stack = new Stack<>();int result = 1;if (n < 0) return 0;if (n == 0) return 1;else {while (n != 0) {Node node = new Node();node.a = n;node.b = n / 2;n = node.b;stack.push(node);}while (!stack.isEmpty()) {result = result * stack.pop().a;}}return result;}/*** (推薦解法)非遞歸方法2:利用棧,單參數(shù)*/public static int non_recursion2(int n) {Stack<Integer> stack = new Stack<>();int result = 1;if (n < 0) return 0;if (n == 0) return 1;else {while (n != 0) {stack.push(n);n = n / 2;}while (!stack.isEmpty()) {result = result * stack.pop();}}return result;}/*** 非遞歸方法3:自定義數(shù)組模擬棧,雙參數(shù)*/public static int non_recursion3(int n) {class Node {int a;int b;}Node[] node = new Node[100];int result = 1;int top = 0;if (n < 0) return 0;if (n == 0) result = 1;else {while (n != 0) {top++;node[top] = new Node();node[top].a = n;node[top].b = n / 2;n = node[top].b;}while (top != 0) {result = result * node[top--].a;}}return result;}/*** 由于是尾遞歸,因此可以不用棧*/public static int non_recursion4(int n) {int result = 1;if (n < 0) return 0;if (n == 0) return 1;else {while (n != 0) {result = result * n;n = n / 2;}return result;}} }總結(jié)
以上是生活随笔為你收集整理的数据结构:利用栈,将递归转换为非递归的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构:用栈实现中缀表达式的求值(文字
- 下一篇: 数据结构:详解KMP算法,手工求解nex