[问题] 递回函数的变量储存

楼主: 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