不好意思又是我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就好
毕竟河内塔就是只要你指定盘子的数目,所有的步骤都是决定好的呀~
当你使用递回时,要思考的应该是“如何把所有会变动的资料都用参数传递”,而非“使用静态/全域变量减少参数”递回有一点像是让电脑帮你计算函式要呼叫几次、顺序为何这个函式应该要尽可能是“纯函数”,才能保证执行结果