C++ HW9-2 for WallPower
使用動態記憶體,計算費氏數列,並與未使用動態記憶的比較時間。
執行結果如下。
參考答案。
執行結果如下。
參考答案。
#include <iostream> #include <time.h> using namespace std; long long fib(long long n); long long fib2(long long n); long long num; long long *temp; int main() { cout << "請輸入n值"; cin >> num; double START, END; START = clock(); //前置time.h start紀錄開啟時間 temp = new long long[num]; //將temp設成一陣列要求num個整數記憶體空間用int 輸出超過 2147483647 會出問題 //大概在輸入46~48之間 改成long long 可以存15位數... for (int i = 0; i < num; i++) //清除記憶體資料為0 *(temp + i) = 0; cout << fib(num - 1) << endl; delete temp; //釋放記憶體空間 END = clock(); //程式結束的時間 可以把這個程式代進普通沒用記憶體儲存的遞迴 可以看時間差多少 cout << (END - START) << "ms" << endl; //計算作業時間 START = clock(); //普通費氏 cout << fib2(num - 1) << endl; END = clock(); cout << (END - START) << "ms" << endl; system("pause"); return 0; } long long fib(long long n) //費氏記憶體遞迴 { if (*(temp + n) != 0) //記憶體內如果有先前資料 回傳使用 (不用再跑一次1+1 2+1 3+2...) return *(temp + n); if (n == 0 || n == 1) //temp陣列第一數第二數為1 回傳1 { *temp = 1; *(temp + 1) = 1; return 1; } return *(temp + n) = fib(n - 1) + fib(n - 2); //如果記憶體內無資料 重新算一次儲存並回傳 } long long fib2(long long n) //普通費氏遞迴 其實沒有long long的必要 但我懶的改 { if (n == 0 || n == 1) return 1; else return fib2(n - 1) + fib2(n - 2); }
留言
張貼留言