2015-06-19 64 views
0
public int count7(int n) 
{ 
    int count = 0; 
    if (n%10 == 7) count= 1; 
    if(n%10 != 7) count= 0; 

    if (n < 10 && n==7) return 1; 
    if (n < 10 && n!=7) return 0; 
    else return count7(n/10) + count; 
} 

我有上述函数递归地添加7在给定数字中的出现次数。每次它将数字除以10以减少1个数字并检查最后一个数字是否等于7.递归函数与本地变量不执行,如果语句

当我将它作为count7(7)运行时,它返回1.我有一个问题,它为什么从未命中第一if语句(if n%10 == 7) count = 1;

如果我的计划是写为:

public int count7(int n) 
{ 
    int count = 0; 
    if (n%10 == 7) count= 0; 
    if(n%10 != 7) count= 0; 

    if (n < 10 && n==7) return 1; 
    if (n < 10 && n!=7) return 0; 
    else return count7(n/10) + count; 
} 

呼叫count7(7)仍能正常工作。我的问题是,当递归调用放在堆栈上时,为什么最后一次调用没有将count赋值为1,而是将其赋值为0?

例如:

Count7(717)

Count7(7) + count <-------This hits the base case since n < 10 
Count(71) + count 
Count(717) + count 

计数被分配1每当ñ%10 == 7.但碱情况下,也将返回1,因为它是请解释此一例只有我无法正确理解的事情。

+1

另外“if(n <10 && n == 7)”是多余的。 – DJClayworth

+0

逐行扫描代码。在你走的时候,把每个变量的值写在一张纸上(记住跟踪所有不同的'count'实例)。 – DJClayworth

+0

你的第二个代码是否适用于count(717)? – lmcphers

回答

2

你在打三个return语句

if (n < 10 && n==7) return 1; 
if (n < 10 && n!=7) return 0; 
else return count7(n/10) + count; 

只有第三个(递归情况下)使用count可变的。当你做count7(7)时,立即触发基本情况,返回1而不关心什么count等于,因为使用了第一个return语句而不是第三个,我想象的是你期望的。

+0

明白了。第一个陈述是返回1而没有进行任何计算,因为它从来没有达到这一点。 – Help123

2

我的问题是,当递归调用放在堆栈上时,为什么上次调用没有将count分配为1,而是将其赋值为0?

count是一个局部变量,并为堆栈中的每个调用设置为不同的值。当n=7if (n < 10 && n==7) return 1;被执行,因此返回1

这就是为什么它并不重要的count值是在基本情况下,由于count值不回考虑。

如果你放松递归变得

count7(717) = count(71) +1 
       (count(7) + 0) + 1 
       1 + 0 + 1 
      -------------- 
        2 
+0

顺便提一下,如果在基本情况返回中使用count的值,代码可以被简化。 –

+0

非常感谢您的详细解释。通过在一张纸上的代码,我把它画出来,并发布了你发布的同样的东西。这非常有帮助! – Help123

0

跟踪代码的执行。当您致电count7(7)它确实触发了您指出的if语句并设置了count = 1,但之后未使用count的值。执行的下一条语句是if (n < 10 && n == 7) return 1,它将退出return语句中的方法。计数的值不被使用,因此您所做的更改对方法的执行没有影响。