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

标签 c++ c algorithm if-statement recursion

使用 Generate all sequences of bits within Hamming distance 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 - 我什至对 感兴趣旧方法。

最佳答案

假设您的函数当前没有返回值,一个简单的解决方案是使用它来指示是否满足终止条件。然后,如果结果为真,您可以使用它立即退出所有递归调用。

不确定我在这里是否正确地捕捉到了您预期的逻辑,但直观的方法应该是这样的:

int magic(char* str, int i, int changesLeft) {
    int result;
    if (changesLeft == 0) {
            printf("%s\n", str);
            return voices(str);
    }
    if (i < 0) return 0;

    // flip current bit
    str[i] = str[i] == '0' ? '1' : '0';
    result = magic(str, i-1, changesLeft-1);

    if( !result ) {
        // or don't flip it (flip it again to undo)
        str[i] = str[i] == '0' ? '1' : '0';
        result = magic(str, i-1, changesLeft);
    }

    return result;
}

关于c++ - 满足动态条件时退出递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40835486/

相关文章:

c++ - C++ 中 MyType(myVar) 声明的意义何在?

C++ std::tuple 破坏顺序

mysql - 循环运行时连续从串口读取数据

宏中的 C++ 编译时间计数器

c++ - 在 C++ 中创建不可变且高效的类的惯用方法

c - 如何使用matlab编码器将matlab函数 'pchip'转换为c代码

c - -DNDEBUG 会干扰 -g 标志吗?

algorithm - 从数组或哈希表访问元素的运行时间是多少?它与查找或搜索有何不同?

algorithm - 什么是位移矢量?

string - 将字符串转换为插入次数最少的回文