看板 C_and_CPP 關於我們 聯絡資訊
不好意思又是我c++新手 想問一個問題 舉個例子 #include<iostream> using namespace std; void f(int); int main(){ f(2); return 0;} void f(int x){ int a=1; int b=2; if (x==1) cout<<a<<b; if(x==2){ a=2; b=1; f(1);} } 印出來結果會使用變數a=1,b=2 我在想有沒有辦法能夠讓遞迴函數每次都使用新設定的變數呢(就我要用f(2)重新指派的變 數a=2 b=1來印出ab) 我想過用static變數(只有第二次有用,剩下都還是沒用xd)、 參照 不過好像都沒搞頭 ps.主要是我在練習河內塔問題的時候,一般解答都是用四個變數的函數 但是如果能夠解決上述問題的話是不是能用一個變數解決呢~ 謝謝! ---- Sent from BePTT on my OPPO CPH1943 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 112.78.66.70 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1695603674.A.133.html ※ 編輯: amamoimi (112.78.66.70 臺灣), 09/25/2023 09:21:36 ※ 編輯: amamoimi (112.78.66.70 臺灣), 09/25/2023 09:51:50
lwecloud: 把變數a,b傳進去;包成class用member variable09/25 10:11
願聞其詳 ※ 編輯: amamoimi (112.78.66.70 臺灣), 09/25/2023 12:09:27
lc85301: 你可以想 x 就是一個你可以設定的東西09/25 13:16
lc85301: 所以你可以把 f 改成 f(int x, int a, int b)09/25 13:16
lc85301: 但這樣太長了,可以包 strcut 當參數來傳09/25 13:17
amamoimi: 所以還是得設多變數才行囉?09/25 17:08
wulouise: 你要render河內塔的圖案還是想做什麼? context比較重要09/25 18:21
sarafciel: n只代表搬動的盤子數而已,你想縮減到剩下n,那就會los09/25 22:00
sarafciel: e掉哪裡搬到哪裡的資訊,自然就變成解不出來河內塔了09/25 22:00
amamoimi: 我想說如果能在函數裡定義a柱b柱c柱,每次盤子增加時呼09/26 08:16
amamoimi: 叫f(x-1)能直接讓f(x-1)的b柱跟c柱調換這樣感覺寫起來09/26 08:16
amamoimi: 比較直觀09/26 08:16
amamoimi: 不過這也只是我初步想法~確切要怎麼寫我也還沒有頭緒09/26 08:17
LPH66: 最簡單的就是告訴函數"你的a柱是誰,b柱是誰,c柱是誰"09/26 15:34
LPH66: 而這就只是簡單地把參數傳進去而已09/26 15:35
LPH66: 遞迴的時候會出現"我的a柱是子問題的b柱"這種事情09/26 15:35
LPH66: 那就直接將告訴我是a柱的東西傳給子問題的b柱就好09/26 15:36
LPH66: (基本上就是二樓提的,要不要包struct隨你)09/26 15:36
了解!
xanxus27: 感覺 如果不是f(int x, int a, int b)的話09/26 16:07
xanxus27: 有一些思路09/26 16:07
xanxus27: x用2位數 4位數來表示 ex. x = a*10 + b 個位數是b09/26 16:17
xanxus27: 十位數是a 這樣只要適當用/跟%應該也能操控09/26 16:17
xanxus27: 直接用陣列 x = [a, b, x]09/26 16:18
請問用陣列的話要怎麼寫好呢 ※ 編輯: amamoimi (112.78.66.70 臺灣), 09/26/2023 17:23:19
wulouise: 每根都是std::stack然後 void(stack& from, stack& to)09/26 22:10
wulouise: 這樣就夠了吧?09/26 22:10
wulouise: 不過stack要看內容比較麻煩,你可以用vector的push_back09/26 22:11
wulouise: pop_back就好09/26 22:11
amamoimi: 我是希望函數可以只用「總共幾個幾個盤子」當變數這樣0
9/27 21:42 ※ 編輯: amamoimi (1.200.27.202 臺灣), 09/27/2023 21:43:20
amamoimi: 畢竟河內塔就是只要你指定盤子的數目,所有的步驟都是決09/27 21:48
amamoimi: 定好的呀~09/27 21:48
sarafciel: https://godbolt.org/z/fvdeT6Wrr 那多包一層就好了09/28 23:14
amamoimi: ...好吧xd我被你說服了 謝謝~09/29 07:42
※ 編輯: amamoimi (1.200.3.16 臺灣), 09/29/2023 07:44:16 ※ 編輯: amamoimi (1.200.3.16 臺灣), 09/29/2023 07:45:01
closer76: 當你使用遞迴時,要思考的應該是「如何把所有會變動的資 09/30 10:59
closer76: 料都用參數傳遞」,而非「使用靜態/全域變數減少參數」 09/30 11:00
closer76: 遞迴有一點像是讓電腦幫你計算函式要呼叫幾次、順序為何 09/30 11:03
closer76: 這個函式應該要盡可能是「純函數」,才能保證執行結果 09/30 11:04
amamoimi: 了解 謝謝前輩! 10/02 10:13