分治回溯 遞迴與分治

2021-10-07 05:48:35 字數 2479 閱讀 2281

程式呼叫自身的程式設計技巧稱為遞迴

public

static

void

show()

它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的**量。

一般來說,遞迴需要有邊界條件、遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回。

遞迴前進段

邊界條件

遞迴返回段

分治演算法就是將原問題劃分成n個規模較小,並且結構與原問題相似的子問題,遞迴地解決這些子問題,然後在合併其結果,就得到原問題的解。

分治演算法的遞迴實現中,每一層遞迴都會涉及這樣三個操作:

分治演算法能解決的問題,一般需要滿足下面這幾個條件:

另外:

範例:前n項求和問題

public

class

recursion

private

static

void

test02()

system.out.

println

(sum);}

private

static

void

test01()

private

static

intsum

(int n)

return

sum(n-1)

+n;}

}

執行結果

5050

5050

範例:n的階乘問題

public

class

recursion02

private

static

void

test02()

system.out.

println

(product);}

private

static

void

test01()

private

static

intfactorial

(int n)

return

factorial

(n-1

)*n;

}}

執行結果

3628800

3628800

範例:斐波那契數列問題

public

class

recursion03

private

static

void

test02()

private

static

intgetfabonacci

(int n)

int first=1;

int second=1;

int current=0;

for(

int i=

3;i<=n;i++

)return current;

}private

static

void

test01()

private

static

intfabonacci

(int n)

return

fabonacci

(n-1)+

fabonacci

(n-2);

}}

執行結果

5

1134903170

遞迴 回溯 分治

題目 給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 方法1 回溯法 o 2 n item.push back nums i 將nums中第i個數字push...

分治與遞迴

分治與遞迴 分治法的設計思想是,將乙個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。對這k個子問題分別求解。如果子問題的規模仍然不夠小,則再劃分為k個子問題,如此遞迴的進行下去,直到問題規模足夠小,很容易求出其解為止。將求出的小規模的問題的解合併為乙個更大規模的問題的解...

遞迴與分治

一 1 求階乘 int factorial int n 2 fibonacci函式 int fibonacci int n 3 全排列 1 字串的全排列 主函式見 2 int permutation char a,int k,int m permutation arr,0,n 1 return 0 ...