首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以在运行时获得递归值?

是否可以在运行时获得递归值?
EN

Stack Overflow用户
提问于 2018-10-25 09:26:22
回答 1查看 42关注 0票数 0

我有一个斐波那契递归函数:

代码语言:javascript
运行
复制
int efib (int num) {     
    if (num == 0){    
        return 0;
    }else if (num == 1){ 
        return 1;
    }else if (num == -1){ 
        return -1;
    }else if (num > 0){  
        return efib(num - 1) +  efib (num - 2);
    }else{    
        return efib (num + 1) + efib(num + 2);
    }
}

我正在尝试找到int值溢出的确切元素num,是否可以获得当前递归值,以便将其与int数据类型可以容纳的最大值进行比较?

我知道包含在斐波那契数列中的整数可以容纳的最大值是1836311903。

EN

回答 1

Stack Overflow用户

发布于 2018-10-25 09:35:34

我正在尝试找到int值溢出的确切元素(num)

为防止溢出,请在相加之前将两个操作数传递给OF test function

它使用“将其与int数据类型可以容纳的最大值进行比较”。

代码语言:javascript
运行
复制
#include <limits.h>
int is_undefined_add1(int a, int b) {
  return (a < 0) ? (b < INT_MIN - a) : (b > INT_MAX - a);
}

   ....
   // return efib(num - 1) +  efib (num - 2);
   int a = efib(num - 1);
   int b = efib(num - 2);
   if (is_undefined_add1(a, b)) {
     fprintf(stderr, "fib[%d] was about to overflow\n", num);
     exit(EXIT_FAILURE);
   }
   return a + b;

如果有更宽的类型(longlong longintmax_t),只需通过该类型添加并根据int范围检查和即可。@Barmar

代码语言:javascript
运行
复制
#if LLONG_MAX/2 >= INT_MAX && LLONG_MIN/2 <= INT_MIN
int is_undefined_add1(int a, int b) {
  long long sum = a;
  sum += b;
  return sum < INT_MIN || sum > INT_MAX;
}
#else
  // as above
#endif
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52980045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档