c - 在 C 中打破递归的惯用方法是什么?

标签 c recursion break

<分区>

假设我们有一个递归函数,f,如果输入不正确,它可能会失败。只有在 f 运行时才能检测到输入中的错误。

在 C 语言中,有什么惯用的方法可以跳出 f(),直接转到原始调用函数,以防出现错误?

setjmp/longjmp 是这里常用的解决方案吗?


玩具示例:

void g() {
    int arr[] = {1, 2, -3, 4};
    int result = f(0, sizeof(arr)/sizeof(int) - 1, arr);

    /* if f() was successful: */
    printf("%d\n", ); 
    /* if error occurred in f: do something else */
}

int f(int n, int i, int *arr) {
    if (i < 0)
        return n;
    /*
    if (arr[i] < 0) <-- "erroneous input"
        break to g()
    */
    return f(arr[i] + n, i-1, arr);
}

最佳答案

选项是:

  1. f() 返回一个状态标志,指示成功或失败。这会导致错误从错误发生的深度一次冒出一层,因此可能不是您想要的。请注意,如果您需要展开任何分配或释放 f() 可能已在每个级别声明的资源,这是唯一安全的选择。

  2. 完全按照您的建议使用setjmp()longjmp() 来模拟抛出异常的效果并直接跳转到错误处理代码。

关于c - 在 C 中打破递归的惯用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9359838/

相关文章:

c - 使用两个管道的双向进程间通信

c - 我应该怎么做才能消除此错误消息?

python - 使用递归打印 n 选择 k 组合算法

algorithm - 过滤算法中缺少逻辑

c - 重写 C 表达式,无需 continue 和 break

functional-programming - "Break"在 OCaml 中不合时宜?

c - 绕过 Windows 对程序文件文件夹的权限限制

android - NDK : using user created . 所以在尝试构建另一个 .so 时

.net - 递归序列生成

.net - 如何彻底关闭以Process.Start启动的控制台应用程序?