一尘不染

满足动态条件时退出递归函数

c

使用函数生成汉明距离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打印后发生,这里:

if (changesLeft == 0) {
    printf("%s\n", str);
    int quit_now = voices(str);
    return;
}

如何做到这一点(停止展开递归并返回到函数调用者)?

尝试:

if (i < 0 || quit_now == 1) return;

似乎只是阻止执行,而且永远不会结束!

PS-我也有兴趣 C 旧的方法论。


阅读 592

收藏
2020-08-03

共1个答案

一尘不染

要以最简单的形式显示,您可以执行以下操作:

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语言中完成操作,只需使用指针而不是引用即可。

2020-08-03