加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中摆脱递归的惯用方法是什么?

发布时间:2020-12-16 09:40:35 所属栏目:百科 来源:网络整理
导读:假设我们有一个递归函数f,如果输入不正确,它可能会失败.只有在f运行时才能检测到输入中的错误. 在发生错误的情况下,C中突破f(),直接转换到原始调用函数的惯用方法是什么? setjmp / longjmp是通常的解决方案吗? 玩具示例: void g() { int arr[] = {1,2,-3,
假设我们有一个递归函数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("%dn",); 
    /* 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);
}

解决方法

选项包括:

>从f()返回状态标志,指示成功或失败.这会导致错误从错误发生的深度一次冒出一个级别,因此可能不是您想要的.请注意,如果您需要解除f()可能在每个级别声明的任何分配或释放资源,这是唯一安全的选项.>完全按照建议使用setjmp()和longjmp()来模拟抛出异常的效果并直接跳转到错误处理代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读