我正在编写使用if \ else控制return语句构建的递归代码。但是当我编译时,我得到了一个缺少的返回语句'因为我的所有回报都在条件中。我正在添加假冒'返回(方法永远不会到达)但我想知道是否有更智能的解决方案。
例如:
@sent_before=@loop_date
非常感谢您的投入!
答案 0 :(得分:3)
我认为如果您将compare(a,i+1);
替换为return compare(a,i+1);
而calcLineSum(a,i+1,sum);
替换为return calcLineSum(a,i+1,sum);
则应该进行编译。
每个if
和else 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阻止。