1. 程式人生 > >簡單遞迴題目分析與解答

簡單遞迴題目分析與解答

1.放蘋果:把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法(用K表示)?注意:5,1,1和1,5,1 是同一種分法。

輸入:
第一行是測試資料的數目t(0 <= t <= 20)。以下每行均包含二個整數M和N,以空格分開。1<=M,N<=10。

輸出:
對輸入的每組資料M和N,用一行輸出相應的K。

樣例輸入:
1
7 3
樣例輸出:
8

int ways (int m,int n) //m:蘋果數 n: 盤子數
{
	if (n == 1 || m == 0)  return 1; //遞迴出口:如果盤子數為1或蘋果數為0 則返回1;
if (n > m) return ways(m,m);//否則 如果n>m,總有n-m個盤子總也沒有蘋果,則對方法數沒有影響,即等價於m個蘋果放進m個盤子裡。 else return ways(m,n - 1) + ways(m - n,n);//如果n<=m,則方法總數為至少一個盤子空著所需的方法(有空盤)+ 所有盤子都不空方法數(無空盤)。 }

2.二叉樹:
在這裡插入圖片描述

圖8-1 滿二叉樹
如圖8-1所示,由正整數1, 2, 3, …組成了一棵無限大的二叉樹。從某一個結點到根結點(編號是1的結點)都有一條唯一的路徑,比如從10到根結點的路徑是(10, 5, 2, 1),從4到根結點的路徑是(4, 2, 1),從根結點1到根結點的路徑上只包含一個結點1,因此路徑就是(1)。對於兩個結點x和y,假設他們到根結點的路徑分別是(x1, x2, … ,1)和(y1, y2, … ,1)(這裡顯然有x = x1,y = y1),那麼必然存在兩個正整數i和j,使得從xi 和 yj開始,有xi = yj , xi + 1 = yj + 1, xi + 2 = yj + 2,… 現在的問題就是,給定x和y,要求xi(也就是yj)。

輸入:
輸入只有一行,包括兩個正整數x和y,這兩個正整數都不大於1000。

輸出:
輸出只有一個正整數xi。

樣例輸入:
10 4
樣例輸出:
2

int f (int x,int y)
{
	if (x > y) //如果x大於y,則查詢x的雙親。
	return f(x / 2,y);
	else if (x < y)//如果y大於x,則查詢yde雙親。
	return f(x,y / 2);
	else if (x == y)//遞迴出口,如果x == y,則說明找到,返回x或y值即可。
	return x;	
}

3.爬樓梯:小明決定從今天開始通過爬樓梯來鍛鍊身體。樓梯共有N級臺階,上樓的時候可以一步上一級臺階,也可以一步上兩級臺階。請你幫她編個程式,計算共有多少種不同的走法。

輸入檔案中有很多行,每行是一個測試資料,只包含一個正整數N。要求計算出對應的走法並輸出,每個結果佔一行。

Sample Input
1
3
12
Sample Output
1
3
233

int W(int n)
{
	if (n == 0 || n == 1) //如果臺階數為0或1,則返回1
	return 1;
	else
	return W(n - 1) + W(n - 2); //我們知道,從第n - 1階和n - 2階都能上到第n階,則上到第n階臺階的方法數 = 前n - 1階的走法 + 前 n - 2階的走法.
}

未完待續…