1. 例子:ios
#include <iostream> using namespace std; //循環實現累加: int Sum(int n) { int sum = 0; for (int i = 1; i <= n; i++) { sum += i; } return sum; } //遞歸實現累加: int RecursiveSum(int n) { if (n == 0) { return 0; } else { return RecursiveSum(n - 1) + n; } } void main() { int num; cout << "請輸入要累加的數:"; cin >> num; int sum1 = Sum(num); int sum2 = RecursiveSum(num); cout << "循環結果爲:" << sum1 << endl; cout << "遞歸結果爲:" << sum2 << endl; system("pause"); }
2. 遞歸轉非遞歸:spa
#include <iostream> #include <stack> using namespace std; //遞歸: void Print1(int n) //打印1~n的數(順序) { if (n <= 0) { return; } else { Print1(n - 1); //交換這兩行位置,則爲逆序 cout << n << " " ; } } //非遞歸: void RecursivePrint1(int n) { stack<int> mystack; /* 1.初始化棧 */ L0: /* 2.設入口標號 */ if (n <= 0) /* 3.非遞歸調用和返回部分照搬 */ { while (!mystack.empty()) /* 5.返回部分替換 */ { cout << mystack.top() << " " ; mystack.pop(); } return ; } else /* 4.遞歸調用Print1(n - 1),替換 */ { mystack.push(n); n = n - 1; goto L0; } } //遞歸(逆序): void Print2(int n) //打印1~n的數(順序) { if (n <= 0) { return; } else { cout << n << " "; Print2(n - 1); } } //非遞歸: void RecursivePrint2(int n) { stack<int> mystack; /* 1.初始化棧 */ L0: /* 2.設入口標號 */ if (n <= 0) /* 3.非遞歸調用和返回部分照搬 */ { return; } else /* 4.遞歸調用Print2(n - 1),替換 */ { mystack.push(n); //吃一個,吐一個,逆序 while (!mystack.empty()) /* 5.返回部分替換 */ { cout << mystack.top() << " "; mystack.pop(); } n = n - 1; goto L0; } } void main() { cout << "遞歸(順序):" << endl; Print1(10); cout << "\n\n非遞歸(順序):" << endl; RecursivePrint1(10); cout << "\n\n遞歸(逆序):" << endl; Print2(10); cout << "\n\n非遞歸(逆序):" << endl; RecursivePrint2(10); cin.get(); }
3. 斐波那契數列 遞歸轉非遞歸:code
#include <iostream> #include <stack> using namespace std; //遞歸斐波那契: int Fibonacci(int n) { if (n == 1) { return 1; } else if (n == 2) { return 1; } else { return Fibonacci(n - 1) + Fibonacci(n - 2);//樹狀遞歸 } } //(方法一)非遞歸斐波那契: int RecursiveFibonacci1(int n) { if (n==1) { return 1; } else if (n == 2) { return 1; } int f1, f2, f3; f1 = f2 = 1; for (int i = 2; i < n; i++) { f3 = f1 + f2; f1 = f2; f2 = f3; //輪替 } return f3; } //(方法二)非遞歸斐波那契: int RecursiveFibonacci2(int n) { if (n == 1) { return 1; } else if (n == 2) { return 1; } stack<int> mystack; int f1, f2, f3; f1 = f2 = 1; int i = 2; L0: if (i < n) { mystack.push(f1); mystack.push(f2); f3 = 0; while (!mystack.empty()) { f3 = f3 + mystack.top(); mystack.pop(); } f1 = f2; f2 = f3; i++; goto L0; } return f3; } void main() { int num; cout << "斐波那契個數:"; cin >> num; cout << "\n\n遞歸斐波那契:" << endl; for (int i = 1; i <= num; i++) { cout << Fibonacci(i) << " "; } cout << "\n\n(方法一)非遞歸斐波那契:" << endl; for (int i = 1; i <= num; i++) { cout << RecursiveFibonacci1(i) << " "; } cout << "\n\n(方法二)非遞歸斐波那契:" << endl; for (int i = 1; i <= num; i++) { cout << RecursiveFibonacci2(i) << " "; } cout <<"\n\n"; system("pause"); }