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

作者: amamoimi (佛仔)   2023-09-25 09:01:12
不好意思又是我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.主要是我在練習河內塔問題的時候,一般解答都是用四個變數的函數
但是如果能夠解決上述問題的話是不是能用一個變數解決呢~
謝謝!
作者: lwecloud (CloudEX)   2023-09-25 10:11:00
把變數a,b傳進去;包成class用member variable
作者: lc85301 (pomelocandy)   2023-09-25 13:16:00
你可以想 x 就是一個你可以設定的東西所以你可以把 f 改成 f(int x, int a, int b)但這樣太長了,可以包 strcut 當參數來傳
作者: amamoimi (佛仔)   2023-09-25 17:08:00
所以還是得設多變數才行囉?
作者: wulouise (在線上!=在電腦前)   2023-09-25 18:21:00
你要render河內塔的圖案還是想做什麼? context比較重要
作者: sarafciel (Cattuz)   2023-09-25 22:00:00
n只代表搬動的盤子數而已,你想縮減到剩下n,那就會lose掉哪裡搬到哪裡的資訊,自然就變成解不出來河內塔了
作者: amamoimi (佛仔)   2023-09-26 08:16:00
我想說如果能在函數裡定義a柱b柱c柱,每次盤子增加時呼叫f(x-1)能直接讓f(x-1)的b柱跟c柱調換這樣感覺寫起來比較直觀不過這也只是我初步想法~確切要怎麼寫我也還沒有頭緒
作者: LPH66 (-6.2598534e+18f)   2023-09-26 15:34:00
最簡單的就是告訴函數"你的a柱是誰,b柱是誰,c柱是誰"而這就只是簡單地把參數傳進去而已遞迴的時候會出現"我的a柱是子問題的b柱"這種事情那就直接將告訴我是a柱的東西傳給子問題的b柱就好(基本上就是二樓提的,要不要包struct隨你)
作者: xanxus27 (XANXUS)   2023-09-26 16:07:00
感覺 如果不是f(int x, int a, int b)的話有一些思路x用2位數 4位數來表示 ex. x = a*10 + b 個位數是b十位數是a 這樣只要適當用/跟%應該也能操控直接用陣列 x = [a, b, x]
作者: wulouise (在線上!=在電腦前)   2023-09-26 22:10:00
每根都是std::stack然後 void(stack& from, stack& to)這樣就夠了吧?不過stack要看內容比較麻煩,你可以用vector的push_backpop_back就好
作者: amamoimi (佛仔)   2023-09-27 21:48:00
畢竟河內塔就是只要你指定盤子的數目,所有的步驟都是決定好的呀~
作者: sarafciel (Cattuz)   2023-09-28 23:14:00
https://godbolt.org/z/fvdeT6Wrr 那多包一層就好了
作者: amamoimi (佛仔)   2023-09-29 07:42:00
...好吧xd我被你說服了 謝謝~
作者: closer76 (克樓瑟)   2023-09-30 10:59:00
當你使用遞迴時,要思考的應該是「如何把所有會變動的資料都用參數傳遞」,而非「使用靜態/全域變數減少參數」遞迴有一點像是讓電腦幫你計算函式要呼叫幾次、順序為何這個函式應該要盡可能是「純函數」,才能保證執行結果
作者: amamoimi (佛仔)   2023-10-02 10:13:00
了解 謝謝前輩!

Links booklink

Contact Us: admin [ a t ] ucptt.com