C++ 在c++;

C++ 在c++;,c++,string,c++11,C++,String,C++11,这是使用位屏蔽生成可能的置换的代码。当I=2,bit=4,mask=7时,我无法理解在这种情况下它是如何执行的 当位为4且掩码为7时,条件(位和掩码)==true将继续。如何再次设置i=2?以及当mask在执行recurse时发生变化时,mask如何变为1(…) #包括 #包括 使用名称空间std; 无效递归(字符串s,整数掩码=0,字符串out=”“) { int n=s.长度(); 如果(out.length()==n)在继续i=3之后不能,并且由于n=3,循环停止。 因此,它向上执行一个

这是使用位屏蔽生成可能的置换的代码。当
I=2,bit=4,mask=7时,我无法理解在这种情况下它是如何执行的

位为4
掩码为7
时,条件
(位和掩码)==true
将继续。如何再次设置i=2?以及当mask在执行recurse时发生变化时,mask如何变为1(…)

#包括
#包括
使用名称空间std;
无效递归(字符串s,整数掩码=0,字符串out=”“)
{ 
int n=s.长度();

如果(out.length()==n)在继续i=3之后不能,并且由于n=3,循环停止。 因此,它向上执行一个递归步骤,并从循环继续:

I:0=>1 -> 1
cond:1
I:1=>2 -> 1
cond:0
re
您可以尝试打印一条语句,上面写着“finished loop”之类的内容来查看这一点


我希望这能回答您的问题。

因为您使用的是递归算法,所以在达到终止条件时需要停止递归(在您的情况下,它是
out.length()==n
)。如果触发此条件,则打印找到的置换,但紧接着会发生什么?您将继续执行该函数。特别是,您将遍历for循环,该循环将打印一些输出(此时没有意义,因为您已到达递归的底部)。事实上,您被触发递归终止条件后打印的输出消息弄糊涂了。请将return语句添加到递归终止检查中:

if (out.length() == n) {
    cout << "OUT: " << out << endl;
    return;
}
if(out.length()==n){

你知道吗?尤其是示例部分可能会让你感兴趣。@lubgr是的,我知道,但我想通过位屏蔽方法来完成。你被
if(mask&bit)之前出现的调试打印弄糊涂了继续;
@UmNyobe是的,由于递归函数,我无法看到每个步骤如何生成输出。为了帮助调试递归,我建议在函数中添加一个深度参数,以便您可以打印数字或打印缩进空格。这与堆栈概念有关。实际上,如果发生递归,我将从上到下移动然后我继续做同样的事情。我想你不能像这样想象它,因为它在那个条件下失败。它与堆栈概念有关。你的问题发生在递归深度3,然后它完成了两个完整的方法,因此在递归深度1,并且再次进入语句,其中I==2
,因为你使用的是递归lgorithm,您需要在某个地方停止递归。
从技术上讲,它确实停止了。
I:0=>1 -> 1
cond:1
I:1=>2 -> 1
cond:0
re
if (out.length() == n) {
    cout << "OUT: " << out << endl;
    return;
}