如何使用if \ else条件在递归方法中正确放置return语句

时间:2016-02-10 22:31:15

标签: java recursion return

我正在编写使用if \ else控制return语句构建的递归代码。但是当我编译时,我得到了一个缺少的返回语句'因为我的所有回报都在条件中。我正在添加假冒'返回(方法永远不会到达)但我想知道是否有更智能的解决方案。

例如:

@sent_before=@loop_date

非常感谢您的投入!

7 个答案:

答案 0 :(得分:3)

我认为如果您将compare(a,i+1);替换为return compare(a,i+1);calcLineSum(a,i+1,sum);替换为return calcLineSum(a,i+1,sum);则应该进行编译。

每个ifelse if都应以return终止。

答案 1 :(得分:1)

首先关闭;正确缩进代码并为所有条件添加大括号。它将认真节省您的调试时间。

当格​​式正确时,很容易发现错误:

private static boolean compare (int[][]a, int i)
{
    if(i==a.length-1)
    {
        return true;
    }
    else
    {
        if(calcLineSum(a[i],0,0)==calcLineSum(a[i+1],0,0))
        {
            compare(a,i+1);
        }
        else 
        {
            return false;
        }
    }
    return false; <=='fake' return
}

您可以清楚地看到compare(a,i+1);语句遗失return。快乐的调试!

答案 2 :(得分:1)

看起来你误解了return。在你的代码中

private static int calcLineSum (int[]a, int i, int sum)
{
    if(i==a.length)
        return sum; // only returns `sum` from this one invocation,
                    // *not* further up the recursive chain
    else {
        sum=sum+a[i];
        calcLineSum(a,i+1,sum);
        // your code is **still going** here; the `return` from
        // the recursive call didn't change anything
        // also note that `sum` hasn't actually changed here
        // sum is passed by value, and changes to it inside the recursive call
        // don't actually make any difference out here
    }
    return sum; // actually used
}

看起来正确的实现将是

private static int calcLineSum(int[] a, int i, int sum) {
  if (i == a.length) {
    return sum;
  } else {
    return calcLineSum(a, i+1, sum + a[i]);
  }
}

答案 3 :(得分:1)

尝试这种方法:

private static boolean compare (int[][]a, int i) {
    boolean result = false;

    if (i == a.length-1) {
        result = true;
    } else {
        if(calcLineSum(a[i],0,0) == calcLineSum(a[i+1],0,0)) {
                result = compare(a,i+1);
        }
    }

    return result;
}

private static int calcLineSum (int[]a, int i, int sum) {
    int result = sum;

    if (i != a.length) {
        result = calcLineSum(a,i+1,sum+a[i]);
    }

    return result;
}

答案 4 :(得分:1)

此处的问题是,非void返回类型必须的方法必须保证返回该类型的值。

忽略特定代码,比较方法的结构基本上是:

if() {
    return
} else {
    if () {
        // you don't return anything here, 
        // so the method might not do what you promised it would,
        // namely return a value
    } else {
        return
    }
}

如果该方法可以运行任何不会返回值的方法,编译器会在上面打电话给你。

答案 5 :(得分:0)

你的递归:

private static int calcLineSum (int[]a, int i, int sum)
{
    if(i==a.length)
        return sum;
    else {
             sum=sum+a[i];
             calcLineSum(a,i+1,sum);
         }
    return sum; //<=='fake' return
}

你可以这样做:

private static int calcLineSum (int[]a, int i, int sum)
{
    if(i==a.length)
        return sum;
    sum=sum+a[i];
    calcLineSum(a,i+1,sum);
}

我所做的就是删除 else 。如果第一个条件未满足,或者使用 else ,则执行以下两行:

sum=sum+a[i];
calcLineSum(a,i+1,sum);

它也简化了您的代码。

此外,您可以删除该行

sum=sum+a[i];
像这样写:

private static int calcLineSum (int[]a, int i, int sum)
{
    if(i==a.length)
        return sum;
    calcLineSum(a,i+1,sum+a[i]);
}

答案 6 :(得分:0)

没有你的最后一句话(你称之为假的);确实有条件不返回任何东西;

例如,在第一种方法中,如果满足以下条件,则不会返回任何内容:

ref.child('items_by_favorites/Masha').on('value', function(snapshot) {
  snapshot.forEach(function(childSnapshot) {
    var key = childSnapshot.key();
    ref.child('items').child(key).once('value', function(itemSnapshot) {
      console.log(itemSnapshot.val());
    });
  });
})

类似于你的第二种方法,你的else块不返回任何东西。

作为一个好的编码实践,请使用{} arround if和else阻止。