递归函数输出错误

时间:2016-10-18 17:04:49

标签: java recursion

在学校寻找Java作业的帮助,我正在尝试创建一个解决以下难题的递归算法:

给定一个起始位置和一个长度为n的数组,其中n-1个正数,数组的最后一个位置为0,例如:

{4 8 5 2 3 5 1 6 4 0}

游戏规则:

  

从起始位置向右移动等于值@ starting   位置,重复,直到你不能再向右移动。

     

一旦你无法再向右移动,以类似的方式向左移动   当你向右移动并停止一旦你不能再移动到   左

     

现在继续重复这个过程。

     

当你移动了最后一个位置时,这个难题就会被解决   数组保持值为0.

     

否则这个谜题是无法解决的。

  1. 在上面的示例中,如果我们启动@第一个位置,即' 4'
  2. 我们向右移动4个位置,结束@ position 5持有值3
  3. 我们向右移动3个位置,结束@位置8持有值6
  4. 我们向左移动6个位置,最后是@ position 2持有值8
  5. 我们向右移动8个位置结束@ last position hold value 0
  6. 因为我们已经移动到阵列的最后位置,所以这个难题是可以解决的。
  7. 我必须使用递归来解决这个难题,我已经提出了算法,但输出我变得假,即使拼图是可以解决的。

    这是我的算法:

    static boolean rightWing(int[] A, int i) //i = starting position
    {
    
        int left=i;
        int right=A.length-i-1;
    
        if (A[i]<right)
        {
            i=i+A[i];
            rightWing(A, i);
        }
        if (A[i]<left)
        {
            i=i-A[i];
            rightWing(A,i);
        }
    
        if (right==A[i])
            return true;
        else
            return false; 
    
    }  
    

1 个答案:

答案 0 :(得分:0)

试试这个,

static boolean rightWing(int[] A, int i) //i = starting position
{

    int left=i;
    int right=A.length-i-1;

    if (A[i]<right)
    {
        i=i+A[i];
        return rightWing(A, i);
    }
    if (A[i]<left)
    {
        i=i-A[i];
        return rightWing(A,i);
    }

    if (right==A[i])
        return true;
    else
        return false; 
} 

注意在对rightWing的递归调用之前的返回。你需要这个,否则你的方法将总是返回第一次调用的右= = A [i]的结果。