我正在学习如何进行递归,我想确保我正确地做到了。我刚刚完成了一个关于codingbat的问题,其内容如下:
给定非负int n,返回7的出现次数 作为数字,例如717产生2.(无循环)。注意mod(%) 乘以10得到最右边的数字(126%10是6),而除(/)除以 10删除最右边的数字(126/10为12)。
count7(717) → 2
count7(7) → 1
count7(123) → 0
我的解决方案看起来像这样:
public int count7(int n) {
int count = 0;
if(n < 7) {
return count;
} else {
int divided = n / 10;
if(n % 10 == 7) count++;
return count + count7(divided);
}
}
即使我的解决方案通过,我也要确保我正确地解决了这些递归问题。我应该在if / else声明之外有一个柜台吗?如果没有,为什么?如果没有,你会如何解决它。
答案 0 :(得分:1)
越自足,越好 - 你的答案是自足的。它有正确递归的两个必要条件:
public int count7(int n) {
int count = 0;
if(n < 7) {
return count;
如果n
小于7,则返回0,因为n
显然不包含7。
} else {
int divided = n / 10;
if(n % 10 == 7) count++;
return count + count7(divided);
}
}
删除最右边的数字并假设问题已解决了剩下的问题。那是递归count7(divided)
。与此同时,最右边的数字怎么样?如果它是7,那么需要进入我们的最终答案,所以加入它。
到目前为止,非常好。
您的结构具有误导性。 count
一开始实际上什么也没做。你可以写下这个:
public int count7(int n) {
if(n < 7) {
return 0;
在这种情况下,您也不需要count++
。如果这是7,我们将添加1,如果不是
} else {
int divided = n / 10;
if(n % 10 == 7) return 1 + count7(divided);
return count7(divided);
}
}
观察到是你的答案 - 但它更加诚实&#34;比你写的。你的递归方式没有任何问题,但我建议的表现可以更清晰,更少被螃蟹。您的代码应该读起来就像您正在采用的方法的口头描述:&#34;如果此数字小于7,则返回0.否则,拉出最后一位数并递归到左边的内容,仅添加1如果我们取消的数字是 a 7。&#34;
存在递归问题,您可能会生成&#34;计数&#34;某种类型的值并将其传递给递归调用,但这不是其中之一。因此整个count
变量只是一个红色的鲱鱼。