冒泡排序
(1)基本思想:在要排序的一組數中,對當前還未排好序的范圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。
(2)用java實現
ublicclassbubbleSort{
publicbubbleSort(){
inta[]={1,54,6,3,78,34,12,45};
inttemp=0;
for(inti=0;i<a.length;i++){
for(intj=i+1;j<a.length;j++){
if(a[i]>a[j]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
for(inti=0;i<a.length;i++)
System.out.println(a[i]);
}
}
遞歸
遞歸演算法,就是程序的自身調用。表現在一段程序中往往會遇到調用自身的那樣一種coding策略,可以利用大道至簡的思想,把一個大的復雜的問題層層轉換為一個小的和原問題相似的問題來求解的這樣一種策略。能看到我們會用很少的語句解決了非常大的問題,所以遞歸策略的最主要體現就是小的代碼量解決了非常復雜的問題。
java代碼:
packagecom.cjq.filedown;
publicclassFab{
publicstaticvoidmain(Stringargs[]){
System.out.println(fab(5));
}
privatestaticintfab(intindex){
if(index==1||index==2){
return1;
}else{
returnfab(index-1)+fab(index-2);
}
}
}
❷ Java數據結構二叉樹深度遞歸調用演算法求內部演算法過程詳解
二叉樹
1
2 3
4 5 6 7
這個二叉樹的深度是3,樹的深度是最大結點所在的層,這里是3.
應該計算所有結點層數,選擇最大的那個。
根據上面的二叉樹代碼,遞歸過程是:
f(1)=f(2)+1 > f(3) +1 ? f(2) + 1 : f(3) +1
f(2) 跟f(3)計算類似上面,要計算左右結點,然後取大者
所以計算順序是f(4.left) = 0, f(4.right) = 0
f(4) = f(4.right) + 1 = 1
然後計算f(5.left) = 0,f(5.right) = 0
f(5) = f(5.right) + 1 =1
f(2) = f(5) + 1 =2
f(1.left) 計算完畢,計算f(1.right) f(3) 跟計算f(2)的過程一樣。
得到f(3) = f(7) +1 = 2
f(1) = f(3) + 1 =3
if(depleft>depright){
returndepleft+1;
}else{
returndepright+1;
}
只有left大於right的時候採取left +1,相等是取right
❸ java中遞歸演算法是什麼怎麼算的
一、遞歸演算法基本思路:
Java遞歸演算法是基於Java語言實現的遞歸演算法。遞歸演算法是一種直接或者間接調用自身函數或者方法的演算法。遞歸演算法實質是把問題分解成規模縮小的同類問題的子問題,然後遞歸調用方法表示問題的解。遞歸往往能給我們帶來非常簡潔非常直觀的代碼形式,從而使我們的編碼大大簡化,然而遞歸的思維確實跟我們的常規思維相逆的,通常都是從上而下的思維問題,而遞歸趨勢從下往上的進行思維。
二、遞歸演算法解決問題的特點:
【1】遞歸就是方法里調用自身。
【2】在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱為遞歸出口。
【3】遞歸演算法代碼顯得很簡潔,但遞歸演算法解題的運行效率較低。所以不提倡用遞歸設計程序。
【4】在遞歸調用的過程中系統為每一層的返回點、局部量等開辟了棧來存儲。遞歸次數過多容易造成棧溢出等,所以一般不提倡用遞歸演算法設計程序。
【5】在做遞歸演算法的時候,一定把握出口,也就是做遞歸演算法必須要有一個明確的遞歸結束條件。這一點是非常重要的。其實這個出口就是一個條件,當滿足了這個條件的時候我們就不再遞歸了。
三、代碼示例:
publicclassFactorial{
//thisisarecursivefunction
intfact(intn){
if(n==1)return1;
returnfact(n-1)*n;
}}
publicclassTestFactorial{publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Factorialfactorial=newFactorial();
System.out.println("factorial(5)="+factorial.fact(5));
}
}
代碼執行流程圖如下:
此程序中n=5就是程序的出口。
❹ java里遞歸和迭代分別是什麼演算法啊
迭代是普通的循環。
例:求從1加到10
int sum=0
for(int i=0;i<= 10;i++){
sum=sum+i;
}
遞歸是指一個函數直接或間接調用自己。
好比:從前有個廟廟里有個大和尚和小和尚,大和尚叫小和尚講故事,小和尚說從前有個廟廟里有個大和尚和小和尚,小和尚叫大和尚講故事,大和尚說從前....
遞歸的特點:
必有三個條件:
1. 間接或直接調用自己。
2. 一定要有退出的條件(比方說大和尚口乾了不聽故事了)。否則就是死循環
3。要有邏輯體(想要做的事);
public int sum(int x){
if(x<=0){
return x;
}
return x+sum(x-1);
}
int s=10;
int total=sum(s);
該例中,sum函數總是調用自己,return x+sum(x-1);
sum有退出條件, x<=0
最後的結果是把 10+9+8+7+... 1 返回
在很多種情況下,迭代和遞歸都可以完成相同的功能, 不過遞歸有些功能迭代就完成不了。 並且代碼沒有遞歸簡潔,熟練使用遞歸後能提高代碼質量。
❺ 用java遞歸方法實現
publicintfun(intn){
if(n==0||n==1)return1;
returnn*fun(n-1);
}
❻ 在JAVA中什麼是遞歸有什麼用
Java方法遞歸是指在一個方法的內部調用自身的過程,以此類推就是java方法遞歸的理解思想,具體來講就是把規模大的問題轉化為規模小的相似的子問題來解決。在函數實現時,因為解決大問題的方法和解決小問題的方法往往是同一個方法,所以就產生了函數調用它自身的情況。另外這個解決問題的函數必須有明顯的結束條件,這樣就不會產生無限遞歸的情況了。因此,java方法遞歸的兩個條件就是,一通過遞歸調用來縮小問題規模,且新問題與原問題有著相同的形式;二存在一種簡單情境,可以使遞歸在簡單情境下退出。
❼ java中遞歸的作用是什麼為什麼要用到遞歸
你的兩個問題其實是一個問題,對吧。
遞歸的作用:遞歸演算法可以解決一些通過遞歸定義的題目。
首先需要明白什麼是遞歸定義的題目,通俗一點來說就是一個大問題中蘊含著小問題,而小問題同時又與大問題的結構相同,只是規模更小。
比如n階乘的定義可以理解為:
n!= n*(n-1)!
從上面不難看出 (n-1)! 就是比n! 規模更小的問題,按照此方法不斷分解下去,就能得到最初的一些基本的已知的數據。然後反過來就可以求出最終的結果了。
n的階乘演算法如下:
private static int jieCheng(int n) {
if(n == 1)
return 1;
else {
return n*jieCheng(n-1);
}
}
還有就是數據結構中二叉樹的定義,也是遞歸定義的。因此二叉樹的好多操作都是通過遞歸實現的。
用遞歸會使程序相當簡潔。
❽ JAVA程序經常用到「遞歸」,「遞歸」的基本思想是
遞歸的核心思想是分解。把一個很復雜的問題使用同一個策略將其分解為較簡單的問題,如果這個的問題仍然不能解決則再次分解,直到問題能被直接處理為止。
比如求 1+1/2+1/3+...+1/n的和,如果按照我們正常銀液搏的思維,就會使用一個循環,把所有的表示式的值加起來,這是最直接的辦法。如果使用遞歸的思維,過程就是這樣的,要求1+1/2+1/3+...+1/n的值,可以先求s1=1+1/2+1/3+...+1/(n-1)的值,再用s1加上1/n就是所求的值,而求s1的過程又可以使用上面的分解策略繼續分解,最終分解到求1+1/2的值,而這個問題簡單到我們可以直接解決,自此問題得到解決。
遞歸強調的分治的策略,再舉個例子,有一種排序演算法叫歸並排序,其思想是這樣的:要對一個無序的數組進行排序,可以將這個數組分解為2個小數組,然後對這兩個數組分別排序,再把排好序的兩個數組合並。而埋漏這一過程中只有「對兩個數組分別排序」不是我們能解決的,但是這個問題可以使用上面的策略進行再次的分解,最後這個問題就被分解到對鋒祥2個元素的數組進行排序,而這個問題簡單到我們可以直接處理。
上面提到的分解的策略,或者說演算法,抽象出來就是我們的函數,因為在這個過程中我們要不同的使用這個策略來不斷的分解問題,所以代碼上就體現為這個函數會不斷的調用自身。還有一點,並不是所有的遞歸都是可以實現的,或者說有意義的。如果在分解的過程中,問題最終不能分解到一個可以直接解決的問題,則這個過程是沒有意義,也就是無限的循環。
具體的代碼都不貼了,有興趣可以網路看看。