)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 插入排序 思想 從打撲克牌說起,這是乙個很形象的例子,日常生活中抓牌的時...