当前位置: 首页 > 面试题库 >

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

孟健
2023-03-14
问题内容

使用函数生成汉明距离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 旧的方法论。


问题答案:

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

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



 类似资料:
  • 如果输入的len()少于10个字符,则调用子函数“tester”的默认值“太短”。 我下面的代码在一定程度上有效。我需要帮助,这样用户可以一次又一次地输入,直到他们键入'quit',在该命令终止时,终端中没有给出任何输出。传接球不起作用,我不知道该在哪里Rest。 我尝试了一段时间,真的,有回报,但我不能再跟随了。

  • 我试图理解这段代码,它返回传递给它的的所有可能组合: 在这里,我尝试了这个样本输入: 在这里,我似乎无法理解递归最终将如何停止并返回,因为函数肯定没有任何指针在列表中移动,在每次调用时,当它满足基本情况时,它返回。根据我的说法,它将调用函数无限,并且永远不会自行停止。或者可能是我错过了什么? 另一方面,take 在完成递归调用后返回返回所有计算后,仅返回的前 个元素。那么,实际上递归如何满足这里的

  • 当条件(if)满足时,我尝试将文本着色为绿色或红色。 这是我的函数getAll() 在我的表格中,有一部分我想给文本上色。下面的例子不起作用。 我也试过,但它总是在绿色或红色上着色。 我想做这样的事情:如果有一天,然后颜色文本的红色或绿色。

  • 我想在java中编写一个函数,该函数接收参数并返回1或0,在以下条件下: > 如果数组的长度是奇数,如果奇数之和大于偶数之和,则返回1,否则返回0。 如果数组的长度是偶数,请检查小于或等于10的最大数字。如果是奇数,则返回1。如果是偶数,则返回0。 例如,使用以下数组: 第一个数组返回 1,因为 = 20 大于 = 14。第二个数组返回 0,因为有 是奇数,但 10 大于 7。 我已经试过了,请检

  • 问题内容: 是否可以在MySQL中执行UPDATE查询,仅在满足特定条件时才更新字段值?像这样: 换一种说法: 正确的方法是什么? 问题答案: 是! 这里有另一个例子: 之所以可行,是因为MySQL不会更新该行(如果没有更改),如docs中所述: 如果将列设置为其当前值,MySQL会注意到这一点,并且不会对其进行更新。

  • 问题内容: 我的数据结构如下: 我正在尝试进行一个SQL查询,该查询将计算正在运行的SUM,但在小时数为3时将重置。结果应如下所示: 问题答案: 您可以使用条件总和创建子组: