遞迴 刷題筆記

2021-09-27 11:24:24 字數 2384 閱讀 6841

2019.9.26

阿蕭上了c語言課並表示暈遞迴

我覺得一定要表現一波,加之之前看書也囫圇吞棗,還是做點題加深理解吧,畢竟遞迴比十連for(草)漂亮多了

漢諾塔問題(只求步數)

公式分析

1階(1) 1-c

2階(3) 1-b 2-c 1-c

3階(7) 1-c 2-b 1-b 3-c 1-a 2-c 1-c

4階時(15),可通過一定步驟簡化為3階,即4在c上,而123依次排列在b上

步驟如下 1-b 2-c 1-c 3-b 1-a 2-b 1-b 4-c

即先將123整體移動到b柱上

綜上 4階的解決方式為 將123整體移動到b柱 再將123整體移動到c柱

以此類推 5階時為 將1234 整體移動到b柱 再將1234 整體移動到c柱

……n階時的步數:

(n-1)階的步數*2+1,n>1;

1,n=1;

**實現:

#include

inthanoi

(int i)

intmain()

i 稍微大一點就爆int了,所以這裡只用作理解有返回值的函式遞迴

p2089 烤雞

題意:

總共十個1-3範圍內的加數,要求加出指定的和,並輸出不同組合的種數,及組合的具體內容

首先看輸出:

如果是先輸出具體組合再輸出種數的話,只要乙個一維陣列,記錄、輸出陣列、ans計數、再清空陣列繼續嘗試就行了。

但這裡要求是相反的,所以需要把組合的具體內容都存起來,故用到二維陣列

然後是具體操作:

很容易想到

for(int i=

1,i<=

3,i++

)

這樣的十連for,但是太難看了,遞迴走起

#include

int n,kind=

0,method[

10000][

10],methoding[10]

;//n為要求的美味程度,method儲存方案,methoding儲存正在嘗試的方案

void

tiaoliao

(int a,

int num)

kind++;}

}else

if(a>=n)

;//若調料未加完,美味程度就已經達到或超出要求,不執行任何操作

else}}

intmain()

return0;

}

詳解一下遞迴過程:

第一次呼叫丟了(0,0)進去,即初始美味程度為0,從第0種調料(注意陣列下標的特殊性)開始。

遞迴開始,直到十種調料都加入。顯然每一次遞迴都是在嘗試下一種調料,所以要寫 num+1 。同時要注意當前美味程度的累加,用累加值開始下一次遞迴,所以是 a+i 。

遞迴全過程的實質是把十種調料中的每一種的1-3的數值都嘗試一遍。當然,n∈[10,30]的時候才會這樣,其他都無解。

總結:

1.void型別函式的遞迴,其實還是用來得出某個或某些值的,如果沒有這個值,那就得是執行printf之類的操作。本題中函式遞迴用來算kind和二維陣列method。但函式返回值只能有乙個,tiaoliao函式又要兩個值,只能是void並且要在引數列表裡搞點小操作。

2.要用自定義函式又想避開指標,就得用到全域性變數,把主函式與自定義函式都可以修改的東西在最前面宣告。注意不要重複宣告,之前就是在main函式裡又宣告了乙個n,導致其在tiaoliao函式中無法使用,最後除錯了幾分鐘才發現。

3.**其實是照著題解邊理解邊寫的……

9.28 新的一天從a題開始

p2799 國王的魔鏡

題意:

反覆判斷是否為回文,若不是則輸出字串長度

注意輸出要求。一開始想到要對字串反覆處理修改其真實長度,但完全不需要,只要把數值直接砍一半就好

#include

#include

char necklace[

100005];

int length;

void

solve

(char a[

100005])

}if(flag)}}

intmain()

遞迴分治問題刷題

1.漢洛塔問題 這個問題可以從只有乙個盤子進行逆推,可以寫成遞迴 如下 include includeusing namespace std 漢羅塔問題 可以從一開始推測 void printf int n,char a,char b void pr int n,char a,char b,char...

leetcode刷題總結之遞迴

前言 最近刷完leetcode遞迴的專題了,無奈本人很菜,關於遞迴每次都是看大佬的題解,自己也設計不出來遞迴,今日打算從遞迴本質出發,徹底剖析遞迴。本文中的大部分遞迴思想來自 遞迴的內涵與經典應用。在數學與電腦科學中,遞迴 recursion 是指在函式的定義中使用函式自身的方法。實際上,遞迴,顧名...

刷題筆記 Binary watch

include include include using namespace std class solution m count push back i for int i 0 i num i vector a n,n 5 將陣列n的前5個元素作為向量a的初值 vector a n 1 n 4 ...