遞迴分治歸併題解

2021-09-25 07:51:52 字數 2224 閱讀 2749

1.漢諾塔、八皇后、斐波那契數列

a: 遞迴計算累加和

前三題均為簡單遞迴,找到遞迴終止條件即可

#include

using namespace std;

intf

(int n)

return n +

f(n -1)

;}intmain()

b: 計算遞推式

#include

using namespace std;

int a, b, n;

intf

(int n)

return a *

f(n -1)

+ b;

}int

main()

return0;

}

c: 計算n階乘

#include

using namespace std;

long

longf(

int n)

intmain()

return0;

}

d: 紅紅的漢諾塔

這題既可以用公式直接輸出結果,也可以使用遞迴的方法求解

公式的方法求解

#include

#include

#include

using namespace std;

intmain()

return0;

}

// 遞迴的方法求解

#include

using namespace std;

int ans1 =

0, ans2 =0;

// ans1為總移動數,ans2為編號為x的盤子的移動次數

void

hanio

(int n,

int x)

hanio

(n -

1, x)

; ans1++;if

(x == n) ans2++

;hanio

(n -

1, x);}

intmain()

return0;

}

//如果弄懂了八皇后的**,重點其實在於如何只輸出一次

#include

#include

#include

using namespace std;

int row[9]

;int flag =1;

void

queen

(int now)

printf

("\n");

flag =0;

return;}

int i, j;

for(i =

0; i <

9; i++)if

(j == now)}}

intmain()

f: 愛吃車厘子的丹丹

找到遞迴終止條件:當天數等於 n 時,返回 m。

遞迴式為 f(n) = 2 * (f(n-1) + 1)。

#include

#include

using namespace std;

typedef

long

long ll;

int n, m, t;

intf

(int a)

return2*

f(a +1)

+2;}

intmain()

return0;

}

g: 紅紅爬樓

首先明確要求的 f(n) 表示的是走到 n 級台階的總方案數。而從前一狀態到達當前狀態有兩種走法,一種為上一級,一種為上兩級,遞迴求和即可。

#include

#include

using namespace std;

intf

(int x)

else

if(x ==2)

return2;

else

return

f(x-1)

+f(x-2);

}int

main()

分治法之歸併排序(遞迴 分治)

歸併排序 思想 1.分而治之,將乙個無序的數列一直一分為二,直到分到序列中只有乙個數的時候,這個序列肯定是有序的,因為只有乙個數,然後將兩個只含有乙個數字的序列合併為含有兩個數字的有序序列,這樣一直進行下去,最後就變成了乙個大的有序數列 2.遞迴的結束條件是分到最小的序列只有乙個數字的時候 時間複雜...

遞迴與分治 歸併排序

描述 給定乙個數列,用歸併排序演算法把它排成公升序。輸入 第一行是乙個整數n n不大於10000 表示要排序的數的個數 下面一行是用空格隔開的n個整數。輸出 輸出排序後的數列,每個數字佔一行。輸入樣例 5 3 2 1 4 5 輸出樣例 1 2345 基本思路 歸併排序是將一組無序的數列,先一分為二,...

歸併排序演算法 分治 雙遞迴

歸併排序運用分治演算法與遞迴思想,那麼其雙遞迴究竟是怎樣的呢?今天被困擾了一會一直覺得並沒有完全理解,後通過思考以及查閱資料,弄懂了其遞迴的真正實現過程!寫給已了解歸併排序的coder code void merge int r,int r1,int s,int m,int t 歸併子串行 whil...