不好意思又是我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 當參數來傳
作者:
wulouise (在線上!=在電腦前)
2023-09-25 18:21:00你要render河內塔的圖案還是想做什麼? context比較重要
n只代表搬動的盤子數而已,你想縮減到剩下n,那就會lose掉哪裡搬到哪裡的資訊,自然就變成解不出來河內塔了
我想說如果能在函數裡定義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就好
畢竟河內塔就是只要你指定盤子的數目,所有的步驟都是決定好的呀~
當你使用遞迴時,要思考的應該是「如何把所有會變動的資料都用參數傳遞」,而非「使用靜態/全域變數減少參數」遞迴有一點像是讓電腦幫你計算函式要呼叫幾次、順序為何這個函式應該要盡可能是「純函數」,才能保證執行結果