從遞迴演算法開始學習

2021-06-16 13:25:51 字數 1945 閱讀 5744

)1、1、2、3、5、8.......用遞迴演算法求第30位數的值?

首先我們可以發現從第3位數起後一位數等於前兩位數值之和,即:x=(x-1)+(x-2),x>2;

這裡需要不斷的相加,第一時刻就會想到迴圈處理,我們嘗試用陣列去裝載這些數值,即:

int a=new int[30];

a[0]=1;

a[1]=1;

for(int i=2;i<30;i++)

a[i]=a[i-1]+a[i-2];

求a[29]的值即為第30位數的值。

遞迴該如何處理呢?同樣定義函式

fun(n)

return fun(n-1)+fun(n-2)//n為第幾位數,第n位數返回值等於第n-1位數的值與第n-2位數的值之和

只有當n>2為這種情況,就可以做個判斷

fun(n)

if(n==1 || n==2)

return 1;

else

return fun(n-1)+fun(n-2);

求fun(30);

【問題】 編寫計算斐波那契(fibonacci)數列的第n項函式fib(n)。

斐波那契數列為:0、1、1、2、3、……,即:

fib(0)=0;

fib(1)=1;

fib(n)=fib(n-1)+fib(n-2) (當n>1時)。

寫成遞迴函式有:

int fib(int n)

遞迴演算法的執行過程分遞推和回歸兩個階段。在遞推階段,把較複雜的問題(規模為n)的求解推到比原問題簡單一些的問題(規模小於n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是說,為計算fib(n),必須先計算fib(n-1)和fib(n-2),而計算fib(n-1)和fib(n-2),又必須先計算fib(n-3)和fib(n-4)。依次類推,直至計算fib(1)和fib(0),分別能立即得到結果1和0。在遞推階段,必須要有終止遞迴的情況。例如在函式fib中,當n為1和0的情況。

在回歸階段,當獲得最簡單情況的解後,逐級返回,依次得到稍複雜問題的解,例如得到fib(1)和fib(0)後,返回得到fib(2)的結果,……,在得到了fib(n-1)和fib(n-2)的結果後,返回得到fib(n)的結果。

在編寫遞迴函式時要注意,函式中的區域性變數和引數知識侷限於當前呼叫層,當遞推進入「簡單問題」層時,原來層次上的引數和區域性變數便被隱蔽起來。在一系列「簡單問題」層,它們各有自己的引數和區域性變數。

由於遞迴引起一系列的函式呼叫,並且可能會有一系列的重複計算,遞迴演算法的執行效率相對較低。當某個遞迴演算法能較方便地轉換成遞推演算法時,通常按遞推演算法編寫程式。例如上例計算斐波那契數列的第n項的函式fib(n)應採用遞推演算法,即從斐波那契數列的前兩項出發,逐次由前兩項計算出下一項,直至計算出要求的第n項。

其他遞迴解題:

求1+2+3+4+5+....+n的值

fun(n)=n+fun(n-1)

n=1時為1

fun(n)

有兩個整數型陣列,從小到大排列,編寫乙個演算法將其合併到乙個陣列中,並從小到大排列

public void fun()

;int b = ;

int c = new int[a.length + b.length];

arraylist al=new arraylist();

int i=0;

int j=0;

while (i <= a.length - 1 && j <= b.length - 1)

else}

//兩個陣列的長度不一樣,必有個陣列沒比較完

while (i <= a.length - 1)//新增a中剩下的

while (j <= b.length - 1)//新增b中剩下的

for (int ii = 0; ii <= c.length-1 ; ii++)

}

學習從自己開始

人生苦短,轉眼大學生活已過大半,回首往事,覺得自己很傻,浪費愛戀很多時間,而學到的知識卻是少之又少,所以現在決定發奮圖強,狂補一下了!現在我們正在學習資料結構,我每天就是去上上課,感覺日子過得很輕鬆,但是沒完我睡在床上,感覺自己一無是處,除了上課時間之外,我的時間全花在同外國人聊天了,雖然這對我的英...

從 開始機器學習

寫在前面 感覺自己學習的東西挺雜,好多都是浮於表面,沒有深度,總是會有一種不踏實的感覺,決心從這一次做起,認認真真的研究乙個方向 這是相當於第二次安裝ubuntu pyhton virtualenv tensorfloe opendv了,還記得第一次安裝的時候,總是有點小害怕,不過害怕歸害怕,錯誤是...

從排序開始 演算法之旅

每次說到排序,都會想起剛學習c語言那會的氣泡排序還有哨兵設定改進方法。但是看過演算法導論後才知道自己是多麼淺薄,排序的方法有很多。問題描述 輸入 n個數的乙個序列 輸出 序列滿足一定條件 如從大到小或是從小到大 的乙個排列 1 插入排序 思想 從打撲克牌說起,這是乙個很形象的例子,日常生活中抓牌的時...