[問題] 遞迴函數的變數儲存

看板C_and_CPP作者 (佛仔)時間7月前 (2023/09/25 09:01), 7月前編輯推噓7(7029)
留言36則, 8人參與, 7月前最新討論串1/1
不好意思又是我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

09/25 10:11, 7月前 , 1F
把變數a,b傳進去;包成class用member variable
09/25 10:11, 1F
願聞其詳 ※ 編輯: amamoimi (112.78.66.70 臺灣), 09/25/2023 12:09:27

09/25 13:16, 7月前 , 2F
你可以想 x 就是一個你可以設定的東西
09/25 13:16, 2F

09/25 13:16, 7月前 , 3F
所以你可以把 f 改成 f(int x, int a, int b)
09/25 13:16, 3F

09/25 13:17, 7月前 , 4F
但這樣太長了,可以包 strcut 當參數來傳
09/25 13:17, 4F

09/25 17:08, 7月前 , 5F
所以還是得設多變數才行囉?
09/25 17:08, 5F

09/25 18:21, 7月前 , 6F
你要render河內塔的圖案還是想做什麼? context比較重要
09/25 18:21, 6F

09/25 22:00, 7月前 , 7F
n只代表搬動的盤子數而已,你想縮減到剩下n,那就會los
09/25 22:00, 7F

09/25 22:00, 7月前 , 8F
e掉哪裡搬到哪裡的資訊,自然就變成解不出來河內塔了
09/25 22:00, 8F

09/26 08:16, 7月前 , 9F
我想說如果能在函數裡定義a柱b柱c柱,每次盤子增加時呼
09/26 08:16, 9F

09/26 08:16, 7月前 , 10F
叫f(x-1)能直接讓f(x-1)的b柱跟c柱調換這樣感覺寫起來
09/26 08:16, 10F

09/26 08:16, 7月前 , 11F
比較直觀
09/26 08:16, 11F

09/26 08:17, 7月前 , 12F
不過這也只是我初步想法~確切要怎麼寫我也還沒有頭緒
09/26 08:17, 12F

09/26 15:34, 7月前 , 13F
最簡單的就是告訴函數"你的a柱是誰,b柱是誰,c柱是誰"
09/26 15:34, 13F

09/26 15:35, 7月前 , 14F
而這就只是簡單地把參數傳進去而已
09/26 15:35, 14F

09/26 15:35, 7月前 , 15F
遞迴的時候會出現"我的a柱是子問題的b柱"這種事情
09/26 15:35, 15F

09/26 15:36, 7月前 , 16F
那就直接將告訴我是a柱的東西傳給子問題的b柱就好
09/26 15:36, 16F

09/26 15:36, 7月前 , 17F
(基本上就是二樓提的,要不要包struct隨你)
09/26 15:36, 17F
了解!

09/26 16:07, 7月前 , 18F
感覺 如果不是f(int x, int a, int b)的話
09/26 16:07, 18F

09/26 16:07, 7月前 , 19F
有一些思路
09/26 16:07, 19F

09/26 16:17, 7月前 , 20F
x用2位數 4位數來表示 ex. x = a*10 + b 個位數是b
09/26 16:17, 20F

09/26 16:17, 7月前 , 21F
十位數是a 這樣只要適當用/跟%應該也能操控
09/26 16:17, 21F

09/26 16:18, 7月前 , 22F
直接用陣列 x = [a, b, x]
09/26 16:18, 22F
請問用陣列的話要怎麼寫好呢 ※ 編輯: amamoimi (112.78.66.70 臺灣), 09/26/2023 17:23:19

09/26 22:10, 7月前 , 23F
每根都是std::stack然後 void(stack& from, stack& to)
09/26 22:10, 23F

09/26 22:10, 7月前 , 24F
這樣就夠了吧?
09/26 22:10, 24F

09/26 22:11, 7月前 , 25F
不過stack要看內容比較麻煩,你可以用vector的push_back
09/26 22:11, 25F

09/26 22:11, 7月前 , 26F
pop_back就好
09/26 22:11, 26F

0, , 27F
我是希望函數可以只用「總共幾個幾個盤子」當變數這樣
0, 27F
9/27 21:42 ※ 編輯: amamoimi (1.200.27.202 臺灣), 09/27/2023 21:43:20

09/27 21:48, 7月前 , 28F
畢竟河內塔就是只要你指定盤子的數目,所有的步驟都是決
09/27 21:48, 28F

09/27 21:48, 7月前 , 29F
定好的呀~
09/27 21:48, 29F

09/28 23:14, 7月前 , 30F
https://godbolt.org/z/fvdeT6Wrr 那多包一層就好了
09/28 23:14, 30F

09/29 07:42, 7月前 , 31F
...好吧xd我被你說服了 謝謝~
09/29 07:42, 31F
※ 編輯: amamoimi (1.200.3.16 臺灣), 09/29/2023 07:44:16 ※ 編輯: amamoimi (1.200.3.16 臺灣), 09/29/2023 07:45:01

09/30 10:59, 7月前 , 32F
當你使用遞迴時,要思考的應該是「如何把所有會變動的資
09/30 10:59, 32F

09/30 11:00, 7月前 , 33F
料都用參數傳遞」,而非「使用靜態/全域變數減少參數」
09/30 11:00, 33F

09/30 11:03, 7月前 , 34F
遞迴有一點像是讓電腦幫你計算函式要呼叫幾次、順序為何
09/30 11:03, 34F

09/30 11:04, 7月前 , 35F
這個函式應該要盡可能是「純函數」,才能保證執行結果
09/30 11:04, 35F

10/02 10:13, 7月前 , 36F
了解 謝謝前輩!
10/02 10:13, 36F
文章代碼(AID): #1b4DlQ4p (C_and_CPP)