※ 本文轉寄自 ptt.cc, 文章原始頁面
看板C_and_CPP
標題

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

時間
最新2023-10-02 10:13:00
留言36則留言,8人參與討論
推噓7 ( 7029 )
不好意思又是我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

36 則留言

※ 編輯: amamoimi (112.78.66.70 臺灣), 09/25/2023 09:21:36
※ 編輯: amamoimi (112.78.66.70 臺灣), 09/25/2023 09:51:50

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

lc85301, 2F
你可以想 x 就是一個你可以設定的東西

lc85301, 3F
所以你可以把 f 改成 f(int x, int a, int b)

lc85301, 4F
但這樣太長了,可以包 strcut 當參數來傳

amamoimi, 5F
所以還是得設多變數才行囉?

wulouise, 6F
你要render河內塔的圖案還是想做什麼? context比較重要

sarafciel, 7F
n只代表搬動的盤子數而已,你想縮減到剩下n,那就會los

sarafciel, 8F
e掉哪裡搬到哪裡的資訊,自然就變成解不出來河內塔了

amamoimi, 9F
我想說如果能在函數裡定義a柱b柱c柱,每次盤子增加時呼

amamoimi, 10F
叫f(x-1)能直接讓f(x-1)的b柱跟c柱調換這樣感覺寫起來

amamoimi, 11F
比較直觀

amamoimi, 12F
不過這也只是我初步想法~確切要怎麼寫我也還沒有頭緒

LPH66, 13F
最簡單的就是告訴函數"你的a柱是誰,b柱是誰,c柱是誰"

LPH66, 14F
而這就只是簡單地把參數傳進去而已

LPH66, 15F
遞迴的時候會出現"我的a柱是子問題的b柱"這種事情

LPH66, 16F
那就直接將告訴我是a柱的東西傳給子問題的b柱就好

LPH66, 17F
(基本上就是二樓提的,要不要包struct隨你)
了解!

xanxus27, 18F
感覺 如果不是f(int x, int a, int b)的話

xanxus27, 19F
有一些思路

xanxus27, 20F
x用2位數 4位數來表示 ex. x = a*10 + b 個位數是b

xanxus27, 21F
十位數是a 這樣只要適當用/跟%應該也能操控

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

wulouise, 23F
每根都是std::stack然後 void(stack& from, stack& to)

wulouise, 24F
這樣就夠了吧?

wulouise, 25F
不過stack要看內容比較麻煩,你可以用vector的push_back

wulouise, 26F
pop_back就好

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

amamoimi, 28F
畢竟河內塔就是只要你指定盤子的數目,所有的步驟都是決

amamoimi, 29F
定好的呀~

sarafciel, 30F
https://godbolt.org/z/fvdeT6Wrr 那多包一層就好了

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

closer76, 32F
當你使用遞迴時,要思考的應該是「如何把所有會變動的資

closer76, 33F
料都用參數傳遞」,而非「使用靜態/全域變數減少參數」

closer76, 34F
遞迴有一點像是讓電腦幫你計算函式要呼叫幾次、順序為何

closer76, 35F
這個函式應該要盡可能是「純函數」,才能保證執行結果

amamoimi, 36F
了解 謝謝前輩!

amamoimi 作者的近期文章

[問題] temporary 可以take reference 嗎?
c++新手最看了一些文章,發現一個問題,舉個例子: #include &lt;iostream&gt; class A{ public: int a=5; int&amp; g(){ return a; } A f(){ return *t
[問題] 用函數設定參照的問題
各位晚安打擾了 https://onlinegdb.com/_DyNuxd2H 我一直不太明白為什麼為什麼這樣寫是合法的 f(a)=5這行不是在把function call設值嗎 但是照理來說只能assign value給變數吧?(gpt這
[問題]char 指標問題
不好意思我程式新手又來擾民了@@ https://onlinegdb.com/Vm941gQ0_ 這是我在書上看到的程式碼 功能是把變數byte by byte的交換 但是我看不太懂那個swap函數... 為什麼可以隨便把參數冠上一個(ch
更多 amamoimi 作者的文章...