试图学习递归的细节

时间:2014-05-04 02:38:06

标签: recursion

我正在学习如何进行递归,我想确保我正确地做到了。我刚刚完成了一个关于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声明之外有一个柜台吗?如果没有,为什么?如果没有,你会如何解决它。

1 个答案:

答案 0 :(得分:1)

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

提供&#34;塞子&#34;

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变量只是一个红色的鲱鱼。