递归不能按预期工作

时间:2015-08-01 20:22:15

标签: c arrays recursion

我有一个数组,我想用递归来填充这个数组。这是关于Collat​​z序列。理解代码没有必要知道问题。我写的代码如下

int recursion(long int n, int *array){
    if(*(array + n)==0){//check if I already have the length of the sequence for this n
        if((n+1)/2==(double)(n+1)/(double)2){//check if n mod 2 == 0
           *(array+n) =recursion((n+1)/2-1,array)+1;
        }       
        else{
           *(array +n)=recursion(3*n+3,array)+1;
        }
    }
    else{
         return *(array+n);
    }
}

所以我的想法是,如果我有一个带零的数组,除了数组[0] = 1,如果我写recursion(100,array),那么函数检查位置100是否为零。如果它为零,则该函数检查另一个条件并为数组[100]分配一个数字。递归地定义该数组[100]。如果最终它看到一个不为零的数组元素,则返回该数组元素。

我希望在n = 100的递归过程中,它不仅会找到array [100]的值,还会找到其他一些数组元素的值。但是如果我在我的main函数中运行这个函数,它给几个数组元素1和数组[100]它也是1,但是应该比1大很多,因为我在每次递归中加1。我真的不知道我在这里看到了什么。

2 个答案:

答案 0 :(得分:2)

有一件事是绝对错误的:你的函数中有一个if,但你只有return一个分支中的值。你应该改变

else{
     return *(array+n);
}

return *(array+n);

以确保函数始终返回值。

顺便说一句,您只需撰写array[n]而不是*(array + n)

答案 1 :(得分:1)

  1. 由于没有创建数组的代码,你确定3 * n + 3小于数组长度吗?

  2. 为元素分配函数返回值:

  3. *(array +n)=recursion(3*n+3,array)+1;

    但您的功能并不总是返回值。 C非常奇怪,不需要检查是否确实存在return语句,并且在这种情况下编译器猜测它或者什么......

    对于gcc,使用-Wreturn-type进行编译,然后会给出警告:

    a.c: In function ‘recursion’:
    a.c:16:1: warning: control reaches end of non-void function [-Wreturn-type]
    
    1. 我对你的文字有点困惑。你知道数组[100]是数组中的第101个元素而不是第100个,不是吗?
    2. 所以,假设n表示数组中的索引(以0开头)而Collat​​z是正数(从1开始)不应该是:

      if( (n+1) % 2 == 0) {
          // this was right one
          array[n] = recursion ( (n+1)/2 - 1, array) + 1; 
      } else {
          // this one was probably wrong
          array[n] = recursion ( 3 * (n+1) /*+ 1 - 1 */, array) + 1; 
      }
      

      然后拨打recursion(99,array)