是否有可能在运行时获取递归值?

时间:2018-10-25 01:26:22

标签: c linux

我有斐波那契递归函数:

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);
    }
}

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

我知道斐波那契数列中一个int可以容纳的最大值为1836311903。

1 个答案:

答案 0 :(得分:0)

  

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

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

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

#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

#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