網頁

2008年10月2日 星期四

Fibonacci Sequence(2)

請列出費氏數列的值 a[n], 當 n=1,2,......,50, 到n為多少開始,C程式RUN出之a[n] 不對。

請不要用遞迴函數寫!你知道原因嗎?

提示:用for-loop

公式解:
a[n]=1/sqrt(5)*((1+sqrt(5))/2)^(n+1)-1/sqrt(5)*(1-sqrt(5))/2)^(n+1)

59 則留言:

  1. using namespace std;
    int main(){
    int i, n=50;
    long x, t, t1;
    for( i = 0; i <= n; i++ ) {
    if( i == 0 ){
    t = 0;
    t1 = 1;
    }
    else if( i == 1 ){
    x=1;
    t = t1;
    t1 = x;
    cout <<"no"i<<" "<< x << endl;
    }
    else {
    x = t + t1;
    t = t1;
    t1 = x;

    cout <<"no"i<<" "<< x << endl;
    }
    }
    system("pause");
    return 0;
    }
    ans:
    到第46個開始不對.
    相同的值.用遞迴函數要計算的次數比for loop多上許多,很多相同的數都計算好幾次.相對之下,for loop能比較有效率的完成計算.且數字越大,相差越多.

    回覆刪除
  2. 以費氏數列這個程式來看,遞迴需花費相當大的 Stack 空間,來儲存每個節點(function call ), 因為每個節點無法共用空間,若 N 的值相當大,那麼程式執行時就得花費相當大的空間與時間 。 而 For loop 程式執行時所花的時間與空間都相對於遞迴都少了許多。
    static int fib(int n)
    {
    int i ;
    if (n<=1)
    return(n);
    else
    {
    for(i=2;i<=n;i++)

    f[i] = f[i-1] + f[i-2] ;
    }
    return (f[n]);
    }
    }

    回覆刪除
  3. int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];

    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout n a[n] endl;
    n++;

    int的範圍是-2147483648~2147483647
    所以到第46項就有錯誤發生溢位,所以就有錯誤產生。

    遞迴函數可以很快解決問題 但是並不有效率 因為 a(n) 中呼叫了 a(n-1) 和 a(n-2) a(n-1) 又會呼叫 a(n-2) 及 a(n-3) 結果發現a(n-2)被重複呼叫 只要 n 越來越大 重複呼叫的次數就會越來越大

    回覆刪除
  4. int main(){
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n " a[n] endl;
    n++;

    輸出結果:
    NO:0 1
    NO:1 1
    NO:2 2
    NO:3 3
    NO:4 5
    NO:5 8
    NO:6 13
    NO:7 21
    NO:8 34
    NO:9 55
    NO:10 89
    NO:11 144
    NO:12 233
    NO:13 377
    NO:14 610
    NO:15 987
    NO:16 1597
    NO:17 2584
    NO:18 4181
    NO:19 6765
    NO:20 10946
    NO:21 17711
    NO:22 28657
    NO:23 46368
    NO:24 75025
    NO:25 121393
    NO:26 196418
    NO:27 317811
    NO:28 514229
    NO:29 832040
    NO:30 1346269
    NO:31 2178309
    NO:32 3524578
    NO:33 5702887
    NO:34 9227465
    NO:35 14930352
    NO:36 24157817
    NO:37 39088169
    NO:38 63245986
    NO:39 102334155
    NO:40 165580141
    NO:41 267914296
    NO:42 433494437
    NO:43 701408733
    NO:44 1134903170
    NO:45 1836311903
    error
    請按任意鍵繼續 . . .

    回覆刪除
  5. int a[51];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    cout<<"a["<< n <<"]"<<" "<< a[n] <<"\n";
    n++;
    if(a[n]<=0)
    {
    cout<<"a["<< n <<"]"<<" start error"<<"\n";

    }
    }
    因為從46開始,之後的數字溢位,所以會變成負數,支後的數字都是錯的!

    回覆刪除
  6. 使用遞迴所用的時間是(指數時間)會比較慢

    int a[51]={1,1};
    for (int i=2;i<51;i++)
    {
    a[i]=2*a[i-1]+a[i-2];
    printf("%2d:%11d\n",i,a[i]);
    }
    system("pause");
    return 0;
    AND:26錯誤

    回覆刪除
  7. int a[51];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    cout<<"a["<< n <<"]"<<" "<< a[n] <<"\n";
    n++;
    if(a[n]<=0)
    {
    cout<<"a["<< n <<"]"<<" start error"<<"\n";
    }
    到第46個開始產生不對。

    回覆刪除
  8. int main(){
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n " a[n] endl;
    n++;

    到第46個開始 是錯誤的

    回覆刪除
  9. B9633170


    int main()
    {
    int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" " a[n] endl;
    n++;
    }
    system("Pause");
    }

    回覆刪除
  10. B9633170

    int main()
    {
    int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" " a[n] endl;
    n++;
    }
    system("Pause");
    }


    第46個開始不對.是負值!!

    回覆刪除
  11. 原因:使用遞迴所用的時間是指數時間,所以不能用遞迴
    int main()
    {
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" " a[n] endl;
    n++;
    }
    system("pause");
    }

    ans:
    到第46個開始不對.

    回覆刪除
  12. 原因:使用遞迴所用的時間是指數時間,所以不能用遞迴
    int main()
    {
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" "a[n] endl;
    n++;
    }
    system("pause");
    }

    ans:
    到第46個開始不對.

    回覆刪除
  13. int a[51];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    cout<<"a["<< n <<"]"<<" "<< a[n] <<"\n";
    n++;
    if(a[n]<=0)
    {
    cout<<"a["<< n <<"]"<<" start error"<<"\n";

    }
    }
    執行到46個出現錯誤

    回覆刪除
  14. int main(){
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n " a[n] endl;
    n++;
    第46個開始錯誤

    回覆刪除
  15. 原因:使用遞迴所用的時間是指數時間,所以不能用遞迴
    int main()
    {
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" " a[n] endl;
    n++;
    }
    system("pause");
    }

    ans:
    到第46個開始不對.

    回覆刪除
  16. 原因:使用遞迴所用的時間是指數時間,所以不能用遞迴
    int main()
    {
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" "a[n]endl;
    n++;
    }
    system("pause");
    }

    ans:
    到第46個開始不對.

    回覆刪除
  17. int a[51],i,x=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    cout<< x <<" "<< a[x] <<"\n";
    x++;
    if(a[x]<=0)
    {
    cout<< x <<" "<<"error"<<"\n";
    break;

    四十六是錯誤的開始

    回覆刪除
  18. int main()
    {
    int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" " a[n] endl;
    n++;
    }
    system("Pause");
    }

    回覆刪除
  19. int main()
    {
    int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" " a[n] endl;
    n++;
    }
    system("Pause");
    }

    回覆刪除
  20. int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    cout<<"a["<< n <<"]"<<" "<< a[n] <<"\n";
    n++;
    if(a[n]<=0)
    {
    cout<<"a["<< n <<"]"<<" start error"<<"\n";
    }
    第46個開始產生不對。

    回覆刪除
  21. 用遞迴會變成指數時間,雖然遞迴可以使答案簡單化但是會有重複性,所以使用非遞迴會必較好。
    using namespace std;
    int main()
    {
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout <<"error"<< endl;
    break;
    }
    else
    cout"NO:"n""a[n]endl;
    n++;
    }
    system("pause");
    }
    而RUN到第46個時會呈現負數

    回覆刪除
  22.     int a[51];
        int i;
        a[0]=1;
        a[1]=1;
        for(i=2;i<=50;i++)
        {
        a[i]=a[i-1]+a[i-2];
        cout<<"a["<<i<<"]="<<a[i]<<endl;
        if (a[i]<0)
        {
        cout<<"a["<<i<<"]=start error"<<endl;
        break ;
        }
        }
    從第46項開始溢位
    用for loop效率較高

    回覆刪除
  23. int main()
    {
    int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" " a[n] endl;
    n++;
    }
    system("Pause");
    }


    46個是負值!!

    回覆刪除
  24. #include <iostream>
    using namespace std;
    int main()
    {
    int a[50];
    int n;
    a[0]=1;
    a[1]=1;
    for(n=2;n<=50;n++)
    {
    a[n]=a[n-1]+a[n-2];
    cout<<"a["<<n<<"]="<<a[n]<<endl;
    if (a[n]<0)
    {
    cout<<"a["<<n<<"]=error"<<endl;
    break ;
    }
    }
    system("pause");
    return 0;
    }

    到第46個開始產生溢位

    回覆刪除
  25. int main(){
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n " a[n] endl;
    n++;
    第46個開始錯誤

    回覆刪除
  26. int main(){
    int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;}
    else
    cout "NO:" n" " a[n] endl;
    n++;}
    system("Pause");}
    ans:第46開始錯誤

    回覆刪除
  27. 遞迴用的時間是指數時間,所以不能用遞迴
    int f[50]={1,1};
    for(int n=2;n<51;n++)
    {
    f[n]=2*f[n-1]+f[n-2];
    printf("%2d : %11d\n",n,f[n]);
    }
    system("pause");
    return 0;
    }
    答:第26個開是錯

    回覆刪除
  28.  int main()
    {
    int x[51];
    int n;
    x[0]=1;
    x[1]=1;
    for(n=2;n<=50;n++)
    {
    x[n]=x[n-1]+x[n-2];
    cout<<"x["<<n<<"]="<<x[n]<<endl;
    if (x[n]<0)
    {
    cout<<"x["<<n<<"]=error"<<endl;
    break ;
    }
    }
    system("pause");
    return 0;
    }

    第46個開始不對.產生負值

    回覆刪除
  29. int a[51];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    cout<<"a["<< n <<"]"<<" "<< a[n] <<"\n";
    n++;
    if(a[n]<=0)
    {
    cout<<"a["<< n <<"]"<<" start error"<<"\n";
    }

    回覆刪除
  30. int main()
    {
    int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" " a[n] endl;
    n++;
    }
    system("Pause");
    }
    第46個開始不對.是負值

    回覆刪除
  31. int main()
    {
    int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" " a[n] endl;
    n++;
    }
    system("Pause");
    }


    第46個開始不對.是負值

    回覆刪除
  32. int main(){
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n " a[n] endl;
    n++;


    第46個開始不對

    回覆刪除
  33. int a[51];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    cout<<"a["<< n <<"]"<<" "<< a[n] <<"\n";
    n++;
    if(a[n]<=0)
    {
    cout<<"a["<< n <<"]"<<" start error"<<"\n";
    }
    到第46個開始產生不對。

    回覆刪除
  34. int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    cout<<"a["<< n <<"]"<<" "<< a[n] <<"\n";
    n++;
    if(a[n]<=0)
    {
    cout<<"a["<< n <<"]"<<" start error"<<"\n";
    }

    第46個開始產生不對。

    回覆刪除
  35. int main(){
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n " a[n] endl;
    n++;
    第46個開始錯誤

    回覆刪除
  36. int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n " a[n] endl;
    n++;

    到第46個開始產生錯誤。

    回覆刪除
  37. int main(){
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n " a[n] endl;
    n++;

    到第46個開始 是錯誤的

    回覆刪除
  38. int main()
    {
    int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" " a[n] endl;
    n++;
    }
    system("Pause");
    }

    從46個開始為負

    回覆刪除
  39. using namespace std;
    int main()
    {
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout <<"error"<< endl;
    break;
    }
    else
    cout"NO:"n""a[n]endl;
    n++;
    }
    system("pause");
    }
    第46個開始不對產生負值

    回覆刪除
  40. int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    cout<<"a["<< n <<"]"<<" "<< a[n] <<"\n";
    n++;
    if(a[n]<=0)
    {
    cout<<"a["<< n <<"]"<<" start error"<<"\n";
    }
    Ans:第46個開始錯誤。

    回覆刪除
  41. int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    cout<<"a["<< n <<"]"<<" "<< a[n] <<"\n";
    n++;
    if(a[n]<=0)
    {
    cout<<"a["<< n <<"]"<<" start error"<<"\n";
    }
    第46個開始不對。

    回覆刪除
  42. int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    cout<<"a["<< n <<"]"<<" "<< a[n] <<"\n";
    n++;
    if(a[n]<=0)
    {
    cout<<"a["<< n <<"]"<<" start error"<<"\n";
    }
    到第46個開始產生不對。

    回覆刪除
  43. using namespace std;
    int main()
    {
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout <<"error"<< endl;
    break;
    }
    else
    cout"NO:"n""a[n]endl;
    n++;
    }
    system("pause");
    }
    從第46個數值開始不對產生負值
    !!!!!

    回覆刪除
  44. 原因:使用遞迴所用的時間是指數時間,所以不能用遞迴
    int main()
    {
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" " a[n] endl;
    n++;
    }
    system("pause");
    }

    ans:
    到第46個開始錯誤

    回覆刪除
  45. int main()
    {
    int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" " a[n] endl;
    n++;
    }
    system("Pause");
    }


    到第46個不對

    回覆刪除
  46. int main()
    {
    int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" " a[n] endl;
    n++;
    }
    system("Pause");
    }


    從46開始的值都是負的

    回覆刪除
  47. int main(){
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n " a[n] endl;
    n++;
    第46個開始是錯的

    回覆刪除
  48. int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    cout<<"a["<< n <<"]"<<" "<< a[n] <<"\n";
    n++;
    if(a[n]<=0)
    {
    cout<<"a["<< n <<"]"<<" start error"<<"\n";
    }
    第46個開始不對。

    回覆刪除
  49. int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];

    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout n a[n] endl;
    n++;

    int的範圍是-2147483648~2147483647
    所以到第46項就有錯誤發生溢位,所以就有錯誤產生。

    遞迴函數可以很快解決問題 但是並不有效率 因為 a(n) 中呼叫了 a(n-1) 和 a(n-2) a(n-1) 又會呼叫 a(n-2) 及 a(n-3) 結果發現a(n-2)被重複呼叫 只要 n 越來越大 重複呼叫的次數就會越來越大

    回覆刪除
  50. int main()
    {
    int a[50];
    double i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout<<"NO:" n" " a[n] endl;
    n++;
    }
    system("pause");
    }




    從46個開始不對.


    使用遞迴所用的時間是指數時間,所以不能用遞迴

    回覆刪除
  51. int main(){
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n " a[n] endl;
    n++;

    到第46個開始 是錯誤的

    回覆刪除
  52. int main()
    {
    int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" " a[n] endl;
    n++;
    }
    system("Pause");
    }
    第46個開始是不對的 是負值

    回覆刪除
  53. using namespace std;
    int main(){
    int i, n=50;
    long x, t, t1;
    for( i = 0; i <= n; i++ ) {
    if( i == 0 ){
    t = 0;
    t1 = 1;
    }
    else if( i == 1 ){
    x=1;
    t = t1;
    t1 = x;
    cout <<"no"i<<" "<< x << endl;
    }
    else {
    x = t + t1;
    t = t1;
    t1 = x;

    cout <<"no"i<<" "<< x << endl;
    }
    }
    system("pause");
    return 0;
    }
    ans:
    到第46個開始不對.
    相同的值.用遞迴函數要計算的次數比for loop多上許多,很多相同的數都計算好幾次.相對之下,for loop能比較有效率的完成計算.且數字越大,相差越多.

    回覆刪除
  54. int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++){
    a[i]=a[i-1]+a[i-2];

    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout n a[n] endl;
    n++;

    int的範圍是-2147483648~2147483647
    所以到第46項就有錯誤發生溢位,所以就有錯誤產生。

    遞迴函數可以很快解決問題 但是並不有效率 因為 a(n) 中呼叫了 a(n-1) 和 a(n-2) a(n-1) 又會呼叫 a(n-2) 及 a(n-3) 結果發現a(n-2)被重複呼叫 只要 n 越來越大 重複呼叫的次數就會越來越大

    回覆刪除
  55. int main()
    {
    int a[50];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" " a[n] endl;
    n++;
    }
    system("Pause");
    }


    第46個開始不對.是負值

    回覆刪除
  56. using namespace std;
    int main(){
    int i, n=50;
    long x, t, t1;
    for( i = 0; i <= n; i++ ) {
    if( i == 0 ){
    t = 0;
    t1 = 1;
    }
    else if( i == 1 ){
    x=1;
    t = t1;
    t1 = x;
    cout <<"no"i<<" "<< x << endl;
    }
    else {
    x = t + t1;
    t = t1;
    t1 = x;

    cout <<"no"i<<" "<< x << endl;
    }
    }
    system("pause");
    return 0;
    }
    ans:
    到第46個開始不對.
    相同的值.用遞迴函數要計算的次數比for loop多上許多,很多相同的數都計算好幾次.相對之下,for loop能比較有效率的完成計算.且數字越大,相差越多.

    回覆刪除
  57. int a[51];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    cout<<"a["<< n <<"]"<<" "<< a[n] <<"\n";
    n++;
    if(a[n]<=0)
    {
    cout<<"a["<< n <<"]"<<" start error"<<"\n";

    }
    }
    執行到46個出現錯誤

    回覆刪除
  58. 原因:使用遞迴所用的時間是指數時間,所以不能用遞迴
    int main()
    {
    int a[50];
    long i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    if(a[n]<=0){
    cout "error" endl;
    break;
    }
    else
    cout "NO:" n" " a[n] endl;
    n++;
    }
    system("pause");
    }

    ans:
    到第46個開始錯誤

    回覆刪除
  59. nt a[51];
    int i,n=0;
    a[0]=1;
    a[1]=1;
    for(i=2;i<=50;i++)
    {
    a[i]=a[i-1]+a[i-2];
    cout<<"a["<< n <<"]"<<" "<< a[n] <<"\n";
    n++;
    if(a[n]<=0)
    {
    cout<<"a["<< n <<"]"<<" start error"<<"\n";

    }
    }
    執行到46個出現錯誤

    回覆刪除

HTML 編輯器