“斐波那契數列”問題的遞推演算法

gudesheng發表於2008-01-03
/*
    標題:<<系統設計師>>應試程式設計例項-[遞推演算法程式設計]
    作者:成曉旭
    時間:2002年09月11日(11:52:00-16:26:00)
          實現遞推演算法的大整數階乖處理函式
    時間:2002年09月16日(18:38:00-20:02:00)
          實現“斐波那契數列”問題的遞推演算法函式
*/

#include    
"stdio.h"
#include    
"stdlib.h"
//:============================“斐波那契數列”問題的遞推演算法===========================
/*
    問題描述:
        標準斐波那契數列:
            F(0) = 0,F(1) = 1,Fn) = F(n-2) + F(n-1)(當n > 1時)
        廣義斐波那契數列:
            F(0) = 0,F(1) = 0,F(2) = 1,Fn) = F(n-3) + F(n-2) + F(n-1)(當n > 2時)
*/

//標準斐波那契數列的遞推演算法函式
int        Std_Fibonacci(int number)
{
    
int    f0 = 0,f1 = 1,result,loop;    //初始值1,2,返回結果,迴圈計數器
    if(number == 0)        return(0);
    
if(number == 1)        return(1);
    
for(loop = 2;loop <= number;loop ++)
    
{
        result 
= f0 + f1;    //由前兩步的結果計算當前結果--->“推出”
        f0 = f1;            //把原來的前一步當作下一次的前兩步--->“傳遞”
        f1 = result;        //把當前結果當作下一次的前一步--->“傳遞”
    }
//注意:在進行這種向前傳遞的操作時,特別小心傳遞的時序
    return(result);
}

//廣義斐波那契數列的遞推演算法函式
int        Ext_Fibonacci(int number)
{
    
int    f0 = 0,f1 = 0,f2 = 1,result,loop;    //初始值1,2,3,返回結果,迴圈計數器
    if(number == 0 || number == 1)        return(0);
    
if(number == 2)        return(1);
    
for(loop = 2;loop <= number;loop ++)
    
{
        result 
= f0 + f1 + f2;    //由前三步的結果計算當前結果
        f0 = f1;
        f1 
= f2;
        f2 
= result;
    }
//注意:在進行這種向前傳遞的操作時,特別小心傳遞的時序[即:變數間賦值的前後關係及先後順序]
    return(result);
}

void    Run_Fibonacci()
{
    
int    large,result;
    
while(large!=9910)
    
{
        printf(
" 請輸入斐波那契數列的元素個數[Enter '9910' to Exit]: ");
        scanf(
"%d",&large);
        
if(large!=9910)
        
{
            
//result = Std_Fibonacci(large);
            result = Ext_Fibonacci(large-1);
            printf(
"斐波那契資料中的第[%d] = %d ",large,result);
        }

    }

}

//:============================“斐波那契數列”問題的遞推演算法===========================


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=935927


相關文章