理論
遞迴函式在執行乙個任務時,需要呼叫函式自身來完成一些子任務。在某些時候,函式不需要繼續呼叫函式自身就可以完成當前子任務。函式不再遞迴的情況稱作基本情形(base case,也稱為基本情況)。而函式呼叫自身來執行子任務的情況就稱作遞迴情形(recursive case)
形式描述
舉例
理論
每次遞迴呼叫都在記憶體中生成乙個新的函式副本(實際上僅僅是一些相關的變數)。
一旦函式結束(即返回某些資料),該返回函式的副本就從記憶體中刪除。遞迴方案看起來簡單,但是視覺化和跟蹤遞迴過程需要花費時間。為了更好地理解歸遞過程,考慮下面的例子。
在這個例子中,假設當引數n-4時呼叫print函式,記憶體分配的視覺化過程如下圖所示。
迭代
問題一:漢諾塔迷題
解析:漢諾塔是乙個數學謎題。
有3根柱子(或木樁、塔)和一些可以在柱子之間來回移動的不同大小的圓盤。
開始時,所有的圓盤按照從小到大的次序自上而下疊放在一根柱子上,形成乙個圓錐結構。
現在要求把整疊圓盤移動到另一根柱子上,移動時要遵守下面的規則:
演算法思路:
public static void hrt(int n, char frompeg, char topeg, char auxpeg)
//利用c做輔助柱將a上n-1個移動到b柱
hrt(n - 1, frompeg, auxpeg, topeg);
system.out.println("移動:從" + frompeg + "到" + topeg);
//利用a做輔助柱將b上n-1個移動到c柱
hrt(n - 1, auxpeg, topeg, frompeg);
}
問題二:給定乙個陣列,請用遞迴方法判定陣列中的元素是否是有序的。
public static int isarrayinsortedorder(int a, int index)
return a[index - 1] <= a[index - 2] ? 0 : isarrayinsortedorder(a,index-1);
}
public static void binary(int n,int a)
system.out.println();
}else
}
public static void kstring(int n,int k,int a)
system.out.println();
}else}}
Java資料結構與演算法 遞迴和回溯
任何呼叫自身的函式成為遞迴。遞迴是從跟數學領域借鑑過來的一種有用的技術,遞迴 通常比迭代 更加簡潔易懂。以階乘喂例,其遞迴定義如下 n 1 n 0 n n n 1 n 0 複製 實現 public static void main string args static int fact int n ...
資料結構與演算法練習 回溯 遞迴
輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。結果請按字母順序輸出。輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。i個字母的排列組合和i 1個字母的排列組合問題...
資料結構與演算法之遞迴(回溯)
問題介紹 八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即 任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。演算法思路分析 1 第乙個皇后先放第一行第一列 2 第...