演算法3 遞迴

2021-10-05 22:41:38 字數 2479 閱讀 5997

簡介:任何乙個可以用計算機求解的問題所需的計算時間都與其規模n有關。問題的規模越小,越容易直接求解,解題所需的計算時間也越少。

分治法的設計思想是,將乙個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。

如果原問題可分割成k個子問題(1<k≤n),且這些子問題都可解,並可利用這些子問題的解求出原問題的解,那麼這種分治法就是可行的。

由分治法產生的子問題往往是原問題的較小模式,這就為使用遞迴技術提供了方便。

fibonacci數列的遞迴演算法:

int

fib(

int n)

該演算法的效率非常低,因為重複遞迴的次數太多。

fibonacci數列的遞推演算法:

int  fib[50]

;void

fibonacci

(int n)

設r= 是要進行排列的n個元素,顯然共有n!種排列。

令ri=r-。集合x中元素的全排列記為perm(x),則(ri)perm(x) 表示在全

排列perm(x)的每乙個排列前加上字首ri得到的排列。

r的全排列可歸納定義如下:

當n=1時,perm(r)=(r), 其中r是集合r中唯一的元素;

當n>1時,perm(r) 由(r1)perm(r1),(r2)perm(r2), ···,(rn )perm(n)構成。

依此遞迴定義,可設計產生perm(r)的遞迴演算法。

演算法:

#include

using

namespace std;

void

perm

(int list,

int k,

int m)

cout<}else}}

intmain()

;perm

(a,2,4

);for(

int i=

2;i<=

4;i++

)}

整數劃分問題是演算法中的乙個經典命題之一。把乙個正整數n表示成一系列正整數之和;

正整數n的這種表示稱為正整數n的劃分。正整數n的不同劃分個數稱為正整數n的劃分數,記作p(n) 。

正整數6有如下11種不同的劃分,所以 。

65+1

4+2, 4+1+1

3+3, 3+2+1, 3+1+1+1

2+2+2, 2+2+1+1, 2+1+1+1+1

1+1+1+1+1+1

演算法分析:

如果中的最大加數s不超過m,即s=max(n1,n2, … ni)≤m,則稱它屬於n的乙個m劃分。我們記n的m劃分的個數為f(n,m)。該問題就轉化為求n的所有劃分個數f(n, n)。我們可以建立f(n, m)的遞迴關係:

1、f(1,m)=1, m≥1

當n=1時,不論m的值為多少(m>0),只有一種劃分即1個1。

2、f(n,1)=1, n≥1

當m=1時,不論n的值為多少(n>0),只有一種劃分即n個1。

3、f(n,m)= f(n,n), m≥n

最大加數s實際上不能超過n。例如,f(3,5)= f(3, 3)。

4、f(n,n)=1+ f(n,n-1)

正整數n的劃分是由s=n的劃分和s≤n-1的劃分構成。例如,f(6,6)=1+ f(6,5)。

5、 f(n,m)= f(n,m-1)+ f(n-m, m),n>m> 1

正整數n的最大加數s不大於m的劃分,是由s =m的劃分和s≤m - 1的劃分組成。

#include

using

namespace std;

intsplit

(int n,

int m)

else

if(nelse

if(n==m)

else

}int

main()

概念

• 遞迴樹是迭代計算的模型.

• 遞迴樹的生成過程與迭代過程一致.

• 遞迴樹上所有項恰好是迭代之後產

生和式中的項.

• 對遞迴樹上的項求和就是迭代後方

程的解.

生成規則

• 初始,遞迴樹只有根結點, 其值為w(n)

• 不斷繼續下述過程:

將函式項葉結點的迭代式w(m)表示成二 層子樹

用該子樹替換該葉結點

• 繼續遞迴樹的生成,直到樹中無函式項

(只有初值)為止.

演算法分析與設計3 遞迴

任何乙個可以用計算機求解的問題所需的計算時間都與其規模n有關。問題的規模越小,越容易直接求解,解題所需的計算時間也越少。分治法的設計思想是,將乙個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。如果原問題可分割成k個子問題 1 k n 且這些子問題都可解,並可利用這些子問...

演算法之遞迴(3) 鍊錶操作

演算法之遞迴 3 鍊錶操作 遞迴 2 嘗試了乙個單鏈表的遍歷,同時又分析了如何新增自己的操作,是在遞迴呼叫之前,還是在遞迴呼叫之後。今天,打算將問題深入一下,即新增相應的操作在遞迴的過程中。解法一 逐層遞迴,遍歷到最後乙個節點,並從返回的節點一次向後遞迴,遍歷n次,找到倒數第n個節點。private...

演算法 遞迴演算法

遞迴演算法的概念,就是通過不斷地呼叫自身,最終達到解決問題的目的。遞迴有兩個點需要注意 1.要不斷的呼叫自身 2.這個遞迴要有出口,不能成為死迴圈 看下面的例子。很多介紹遞迴演算法的,都會用遞迴來做乙個題目 計算乙個數的階層。例如 計算5的階層,5 5 x 4 x 3 x 2 x 1 用遞迴來實現 ...