面向對象的基礎——遞歸算法

C++ 基礎

遞歸算法

遞歸:

直接或間接調用自身
層層分解,由n到n-1的過程

遞歸的關鍵:找出遞歸定義遞歸終止條件
遞歸三步驟

例題:
1-100的和

注意:遞歸的實現過程
遞歸的調用過程使得問題簡化,回溯求的問題問題的解

歐幾里得算法(最大公約數)

遞歸:gcd(m,n)=gc(n,m%n)
終止條件:gcd(m,0)=m
GCD(m,N)     //約定m>n
{	if(n==0)  return(m);
	[else] return (GCD(n,m%n));

注意:[else]是一個可選項,else不寫不影響結果

快速冪
例題:求a^b的值

a5=a*(a4)
=a*(a2)*(a2)
=a*((aa)(a*a)

當b爲奇數,拆成a*a^b
當 b爲偶數,可以拆成a^(b/2)

typedef long long ll;     //c語言宏定義類型
ll binaryPow(ll a,llb){     //binaryPow:二分冪
	if(b==1)
		return a;
//處理問題,有兩種情況要考慮
	else if(b%2==1)
		return a*binaryPow(a,b-1);
	else{
		ll num=binaryPow(a,b/2);
		return num*num;     //優化
	//不直接寫成 binaryPow(a,b/2)*binaryPow(a,b/2),這種的是調用兩次

		

集合的全排列問題

  1. 先把高位排好
  2. 高位有若干種情況,就需要將高位轉化成多個子問題。每個子問題都與高位的排列有關係。
  3. 要列出高位的所有情況,以確定子問題。

需要枚舉(暴力)

//產生從元素k~m的全排列,作爲前k-1個元素的後綴
void Perm(int List[],int k,int m)
{
	//構成一次全排列,輸出結果
	if(k==m)
	{
		for(int i=0;i<=m;i++)
			cout<<List[i]<<" ";
			cout<<endl;
	else 
		//在數組list中,從元素k~m的全排列
		for(int j=k;j<=m;j++)
		{
			swap(list[k],list[j]);
			Perm(list,k+1,m);
			swap(list[k],list[j]);     //恢復現場

枚舉法每一個小情況都是獨立的
在特定情況下會出現若干種情況,每一個情
況都是獨立的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章