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]的時候才會這樣,其他都無解。
總結:9.28 新的一天從a題開始1.void型別函式的遞迴,其實還是用來得出某個或某些值的,如果沒有這個值,那就得是執行printf之類的操作。本題中函式遞迴用來算kind和二維陣列method。但函式返回值只能有乙個,tiaoliao函式又要兩個值,只能是void並且要在引數列表裡搞點小操作。
2.要用自定義函式又想避開指標,就得用到全域性變數,把主函式與自定義函式都可以修改的東西在最前面宣告。注意不要重複宣告,之前就是在main函式裡又宣告了乙個n,導致其在tiaoliao函式中無法使用,最後除錯了幾分鐘才發現。
3.**其實是照著題解邊理解邊寫的……
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 ...