使用函数生成汉明距离t内的所有位序列:
void magic(char* str, int i, int changesLeft) { if (changesLeft == 0) { printf("%s\n", str); return; } if (i < 0) return; // flip current bit str[i] = str[i] == '0' ? '1' : '0'; magic(str, i-1, changesLeft-1); // or don't flip it (flip it again to undo) str[i] = str[i] == '0' ? '1' : '0'; magic(str, i-1, changesLeft); }
我想退出递归函数,并在发生某种情况时返回调用方函数(如果确实如此)。因此,就像我的递归功能正在听到可能告诉她退出的声音一样!
它仅在 str打印后发生,这里:
str
if (changesLeft == 0) { printf("%s\n", str); int quit_now = voices(str); return; }
如何做到这一点(停止展开递归并返回到函数调用者)?
尝试:
if (i < 0 || quit_now == 1) return;
似乎只是阻止执行,而且永远不会结束!
PS-我也有兴趣 C 旧的方法论。
C
要以最简单的形式显示,您可以执行以下操作:
void foo(bool & ret) { // doStuff... if (ret) return; foo(ret); // doStuff... if (ret) return; foo(ret); }
然后,您启动递归:
bool ret = false; foo(ret);
在您的情况下,您可以通过以下方式中断递归
if (!changesLeft) { printf("%s\n", str); ret = true; return; }
设置为true将使您脱离整个调用树。
您也可以在C语言中完成操作,只需使用指针而不是引用即可。