資料結構與演算法 遞迴和回溯

2022-06-30 01:42:09 字數 1439 閱讀 3430

理論

遞迴函式在執行乙個任務時,需要呼叫函式自身來完成一些子任務。在某些時候,函式不需要繼續呼叫函式自身就可以完成當前子任務。函式不再遞迴的情況稱作基本情形(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 第...