递归增量澄清

时间:2012-10-18 18:03:54

标签: c++

我有以下功能:

      int v[]={0,1,1,1};
      int f(int x)
      {
          if(x>=1)  return v[x]+f(x-1);
          else return 0; 
      }

当我在main中调用它时:cout<<f(4);它输出'4'但我希望是'3' 有人可以澄清为什么我得到'4'而不是'3'? (我想我错过了什么)

4 个答案:

答案 0 :(得分:7)

v [4]未定义。它有4个元素,因此最大数组索引为3。

答案 1 :(得分:4)

任何事情都可能发生,因为这是未定义的行为。 C ++中的数组是基于0的 - 它们从0开始并转到元素数量 - 1

4是完全有效的答案,1042也是如此。

v只有索引0...3,除此之外的任何东西都是UB。

答案 2 :(得分:2)

v [4]有4个元素,因此最大索引是3.数组索引从0开始,因为你没有初始化它,所以最大索引为3,因为它目前有4个元素。

答案 3 :(得分:0)

的输出
      int v[]={0,1,1,1};
      int f(int x)
      {
          if(x>=1)  return v[x]+f(x-1);
          else return 0; 
      }
使用cout << f(4)调用时,

未定义,因为它的值超出x = 3。这是不正确的。数组从0开始,对于您的数组,其范围为0 - > 3(= 4个元素)。

要更正它,您必须致电cout << f(3);

同时检查范围:

int f(x)内的这样一个简单的检查会给你正确的结果。

这样的事情:

  #define checkRange(x,y) (((sizeof(x)/sizeof(x[0])) >= y)?true:false)

  int v[]={0,1,1,1};
  int f(int x)
  {
      if(!checkRange(v,x)){
          return 0+f(x-1);
      }
      if(x>=1)  return v[x]+f(x-1);
      else return 0; 
  }