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);
}

留言
張貼留言