Recursion 尝试学习递归的细节

Recursion 尝试学习递归的细节,recursion,Recursion,我正在学习如何做递归,我想确保我做得正确。我刚刚完成了一个关于codingbat的问题,内容如下: 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

我正在学习如何做递归,我想确保我做得正确。我刚刚完成了一个关于codingbat的问题,内容如下:

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);
    }
}
给定一个非负整数n,返回7的出现次数 作为一个数字,例如717产生2。(无循环)。注意mod(%) 乘10得到最右边的数字(126%10是6),而除以(/) 10删除最右边的数字(126/10为12)

我的解决方案有效,如下所示:

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);
    }
}
public int count7(int n){
整数计数=0;
if(n<7){
返回计数;
}否则{
整数除以=n/10;
如果(n%10==7)计数++;
返回计数+计数7(除以);
}
}

即使我的解决方案通过了,我还是希望确保我正确地处理了这些递归问题。我是否应该在if/else语句外设置一个柜台?若否,原因为何?如果不是,你将如何解决它。

越独立越好-你的答案是独立的。它有两个正确递归的必要条件:

提供一个“塞子” 去掉最右边的数字,并假设剩下的数字问题已经解决。这就是递归
count7(除法)
。同时,最右边的那个数字呢?如果它是7,那就需要进入我们的最终答案,所以把它加进去

到目前为止,一切顺利

评论文章 你的结构有误导性<代码>计数在开始时实际上什么都不做。你可以这样写:

public int count7(int n) {
    if(n < 7) {
        return 0;
注意这是你的答案——但它比你写的更“诚实”。您的递归方式没有什么问题,但我建议,演示可以更清晰、更简洁。你的代码读起来应该像是对你正在采取的方法的口头描述:“如果这个数字小于7,则返回0。否则,去掉最后一个数字并在剩下的数字上递归,只有当我们去掉的数字是7时,才加1。”


存在递归问题,您可能会生成某种类型的“count”值并将其传递到递归调用中,但这不是其中之一。因此,整个
count
变量的事情只是一条红鲱鱼。

您首先应该有一个
count
变量吗?它实际上“计数”不多——它从0开始,然后将最大值增加一倍到1——因此您可以完全删除该变量,让if直接返回0,并在else return 1+递归调用中返回。
    } else {
        int divided = n / 10;
        if(n % 10 == 7) count++;
        return count + count7(divided);
    }
}
public int count7(int n) {
    if(n < 7) {
        return 0;
    } else {
        int divided = n / 10;
        if(n % 10 == 7) return 1 + count7(divided);
        return count7(divided);
    }
}