遞迴習題整理

2022-08-19 14:51:12 字數 3109 閱讀 7494

1、子集問題

求n個正整數構成的乙個給定集合a = 的子集,子集的和要等於乙個給定的正整數d。請輸出所有符合條件的子集。

解題思路:

1)從原始集合中分離出乙個元素,它有兩種選擇:選擇放入接軌集合,或者不放入結果集合;

2)對於剩下的集合,重複1的動作,直到原始集合為空集,證明所有子集已經選取完成了;

/*

* * 子集問題

* @param sofar 當前原始集合還存在的數字

* @param rest 存放結果的集合 */

void recsubsets(string sofar, int

rest)

}

2.排列問題求n個正整數構成的乙個給定集合a = 的全排列

1)輸入串中選擇乙個加入輸出串

2)剩下的輸出串中在加乙個到輸出串;知道輸入串為空

/*

* * 排列問題

* @param sofar 已經被選擇的字母

* @param rest 沒有被選擇的字母 */

void recpermute(string sofar, string

rest)

} }

子集問題和排列問題可以說是遞迴的兩個最為基礎重要的問題了,子集問題是分離重複,而排列問題是選擇重複,理解這兩個遞迴,對我們認識遞迴有很重要的作用。

遞迴回溯子路簡單整理:

bool

solve (configuration conf)

return

false

} }

3、rpg難題有排成一行的n個方格,用紅(red)、粉(pink)、綠(green)三色塗每個格仔,每格塗一色,要求任何相鄰的方格不能同色,且首尾兩格也不同色.求全部的滿足要求的塗法.

解題思路: 子集問題

陣列 f[i] 存放i個方格有多少種塗法

n個方格可以由n-1個方格和n-2個方格填充得到

1)在一塗好的n-1個格仔裡最後再插入乙個格仔,就得到了n個格仔了。因為已經填好n-1的格仔中,每兩個格仔的顏色都不相同。所以只有1種填法。

這種情況下 f(n) 一種有f(n-1)種填法。

2)假如前面 n-2個合法 ,但是第n-1個不合法 ,即第n-1個和第乙個顏色一樣,這個時候最後乙個格仔顏色可以有2種

這種情況下f(n) 有 2*f(n-2)種填法。

所以 f(n) = f(n-1) + 2* f(n-2)

4、eof串

長度為n的字串只由 eof 組成,且o和o不相鄰,求所有滿足要求字串個數。

解題思路:

分為2種情況討論,最後是o最後不是o

把末尾是o的情況儲存在d[i][0]裡面,把最後不是o的儲存在d[i][1]裡;

在原來的字串加上 o要得到合法字串,末尾必然不為o,即d[n][0] = d[n-1][1];

在原來字串加上非o要得到合法字串,末尾隨意,即d[n][1] = d[n-1][0] + d[n-1][1];

d[1][0] = 1; d[1][1] = 2;

5.**概率

輸入資料的第一行是乙個整數c,表示測試例項的個數,然後是c 行資料,每行包含乙個整數n(1解題思路:

錯排: 

n張票的所有排列可能自然是an

n = n!種排列方式,現在分析n張票排錯的情況:

如果前面n-1個人拿的都不是自己的票,即前n-1個人滿足錯排,現在又來了乙個人,他手裡拿的是自己的票。只要他把自己的票與其他n-1個人中的任意乙個交換,就可以滿足n個人的錯排。這時有n-1種方法。

如果前n-1個人不滿足錯排,而第n個人把自己的票與其中乙個人交換後恰好滿足錯排。這種情況發生在原先n-1人中,n-2個人滿足錯排,有且僅有乙個人拿的是自己的票,而第n個人恰好與他做了交換,這時候就滿足了錯排。

為前n-1個人中,每個人都有機會拿著自己的票。所以有n-1種交換的可能。

f(n) = (i - 1) * [f(n - 1) + f(n - 2)]

6.考新郎

首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排;

然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並且不允許多人找乙個.

假設一共有n對新婚夫婦,其中有m個新郎找錯了新娘,求發生這種情況一共有多少種可能.

方法同上,可以自己思考一下

7.折線分割平面

我們看到過很多直線分割平面的題目,今天的這個題目稍微有些變化,我們要求的是n條折線分割平面的最大數目。比如,一條折線可以將平面分成兩部分,兩條折線最多可以將平面分成7部分,具體如下所示。

解題思路:

假如是直線分割:n條相交的直線最多能把平面分割成幾塊。

新增第n條直線,平面最多的情況是 第n條直線與前面 n-1條直線都相交,切沒有三條直線交於一點。這樣,第n條直線一共有n-1個交點。我們知道,增加n個焦點,則增加n+1個平面。

所以 n條直線分割平面最大數是:

1 + 1 + 2 + 3 + ... + n = (n2 + n + 2) / 2

假如每次增加的不是一條直線,而是一對平行線:

當第n次新增時,前面已經有2n-2條直線了,第n次新增時,第2n-1條直線和第2n條直線各能增加2(n-1)+1個平面。所以第n次新增增加的面數是2[2(n-1) + 1] = 4n - 2 個,總面數等差數列計算 應該是1 + 4n(n+1)/2 - 2n = 2n2 + 1 。

如果,每次加進來的平行邊換成一頭相交的折線:

我們看到,平面1、3已經合為乙個面,既少了乙個面。因此,每當一組平行線相交後,就會減少乙個面。

因此,本題所要求的折線分割平面,自然就是上面求的的平行線分割平面數減去n。即 f(n) = 2n2 - n + 1;

HiveSql整理 , 習題

unix timestamp 返回當前或指定時間的時間戳 from unixtime 將時間戳轉為日期格式 current date 當前日期 current timestamp 當前的日期加時間 to date 抽取日期部分 year 獲取年 month 獲取月 day 獲取日 hour 獲取時 ...

遞迴與非遞迴習題

1.遞迴和非遞迴分別實現求第n個斐波那契數。includeint fib int n else 可以跳n節台階 是2 fib n 1 int main includeint fib int n if n 1 n 2 return 1 while a return f3 int main 2.編寫乙個...

遞迴習題練習

1.二分查詢筆試題 給定乙個排序陣列和目標陣列,在陣列找到目標值並返回其索引,如不存在陣列中,則返回他將會按順序插入的位置。class ppublic indexnode int index,boolean flag public static indexnode findval int arr,i...