colour[5]={0};
void _do()
{
colour[i]=1;
for(int i=0;i<5;i++){
_do(i);
}
}
我的问题是,在最后一次递归结束时,我们将开始从最后到第一次的旅程。当我们回到前面的呼叫时,我们会看到什么?我们将所有颜色设置为1吗?或者我们得到剩余的0,那些没有调用那个函数。
问题是,如果我们在一个调用中更新一个数组,我们会在返回上一个调用时得到更新吗?或者我们会得到该数组的先前版本?
提前谢谢。
答案 0 :(得分:2)
首先,代码不会编译 - 在第5行,你引用“i”而不声明它(发生在第6行)。
即使你修复它,代码也会无限递归 - 你已经点击了“for”循环的第一次迭代,调用_do(1)然后进入“for”循环并再次调用_do(1)
答案 1 :(得分:1)
要开始回程,你需要有一个从函数的最开头开始的if语句,当该语句为true时实际返回一个值。
答案 2 :(得分:0)
如果数组是在递归方法之外定义的,则在递归完成时它将保持更改状态。如果它是在递归步骤(在方法内)中定义而未返回,则从未发生过更改。
答案 3 :(得分:0)
你在这里打破了递归的基本概念 - 递归而不是迭代。这就是你的方式:
int colour[5]={0};
void _do(int i)
{
if (i < sizeof(colour))
{
colour[i]=1;
_do(i + 1);
}
}
基本上,你要么迭代,或递归。哪一个更好取决于情况,数据结构的类型,您正在使用的其他功能的行为等。
在这种特殊情况下,我通常会迭代。
关于具体问题:该函数的副作用是修改数组colour
,这意味着所有修改将立即自动应用于该数组。