作者amamoimi (佛仔)
看板C_and_CPP
標題[問題] 遞迴函數的變數儲存
時間Mon Sep 25 09:01:12 2023
不好意思又是我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://webptt.com/m.aspx?n=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
1F:推 lwecloud: 把變數a,b傳進去;包成class用member variable09/25 10:11
願聞其詳
※ 編輯: amamoimi (112.78.66.70 臺灣), 09/25/2023 12:09:27
2F:推 lc85301: 你可以想 x 就是一個你可以設定的東西09/25 13:16
3F:→ lc85301: 所以你可以把 f 改成 f(int x, int a, int b)09/25 13:16
4F:→ lc85301: 但這樣太長了,可以包 strcut 當參數來傳09/25 13:17
5F:→ amamoimi: 所以還是得設多變數才行囉?09/25 17:08
6F:推 wulouise: 你要render河內塔的圖案還是想做什麼? context比較重要09/25 18:21
7F:推 sarafciel: n只代表搬動的盤子數而已,你想縮減到剩下n,那就會los09/25 22:00
8F:→ sarafciel: e掉哪裡搬到哪裡的資訊,自然就變成解不出來河內塔了09/25 22:00
9F:→ amamoimi: 我想說如果能在函數裡定義a柱b柱c柱,每次盤子增加時呼09/26 08:16
10F:→ amamoimi: 叫f(x-1)能直接讓f(x-1)的b柱跟c柱調換這樣感覺寫起來09/26 08:16
11F:→ amamoimi: 比較直觀09/26 08:16
12F:→ amamoimi: 不過這也只是我初步想法~確切要怎麼寫我也還沒有頭緒09/26 08:17
13F:推 LPH66: 最簡單的就是告訴函數"你的a柱是誰,b柱是誰,c柱是誰"09/26 15:34
14F:→ LPH66: 而這就只是簡單地把參數傳進去而已09/26 15:35
15F:→ LPH66: 遞迴的時候會出現"我的a柱是子問題的b柱"這種事情09/26 15:35
16F:→ LPH66: 那就直接將告訴我是a柱的東西傳給子問題的b柱就好09/26 15:36
17F:→ LPH66: (基本上就是二樓提的,要不要包struct隨你)09/26 15:36
了解!
18F:→ xanxus27: 感覺 如果不是f(int x, int a, int b)的話09/26 16:07
19F:→ xanxus27: 有一些思路09/26 16:07
20F:→ xanxus27: x用2位數 4位數來表示 ex. x = a*10 + b 個位數是b09/26 16:17
21F:→ xanxus27: 十位數是a 這樣只要適當用/跟%應該也能操控09/26 16:17
22F:→ xanxus27: 直接用陣列 x = [a, b, x]09/26 16:18
請問用陣列的話要怎麼寫好呢
※ 編輯: amamoimi (112.78.66.70 臺灣), 09/26/2023 17:23:19
23F:推 wulouise: 每根都是std::stack然後 void(stack& from, stack& to)09/26 22:10
24F:→ wulouise: 這樣就夠了吧?09/26 22:10
25F:→ wulouise: 不過stack要看內容比較麻煩,你可以用vector的push_back09/26 22:11
26F:→ wulouise: pop_back就好09/26 22:11
27F:→ amamoimi: 我是希望函數可以只用「總共幾個幾個盤子」當變數這樣0
9/27 21:42
※ 編輯: amamoimi (1.200.27.202 臺灣), 09/27/2023 21:43:20
28F:→ amamoimi: 畢竟河內塔就是只要你指定盤子的數目,所有的步驟都是決09/27 21:48
29F:→ amamoimi: 定好的呀~09/27 21:48
31F:→ 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
32F:推 closer76: 當你使用遞迴時,要思考的應該是「如何把所有會變動的資 09/30 10:59
33F:→ closer76: 料都用參數傳遞」,而非「使用靜態/全域變數減少參數」 09/30 11:00
34F:→ closer76: 遞迴有一點像是讓電腦幫你計算函式要呼叫幾次、順序為何 09/30 11:03
35F:→ closer76: 這個函式應該要盡可能是「純函數」,才能保證執行結果 09/30 11:04
36F:→ amamoimi: 了解 謝謝前輩! 10/02 10:13