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
当n%10 == 7时,计数被赋值为1。但基本情况也会返回1.请解释这一个案例,因为这是我唯一无法正确理解的事情。
答案 0 :(得分:2)
我的问题是,当递归调用放在堆栈上时,为什么最后一次调用不会将count指定为1而是将其指定为0?
count
是一个局部变量,并为堆栈中的每个调用设置不同的值。当n=7
,if (n < 10 && n==7) return 1;
被执行并因此返回1.
这就是为什么count
在基本情况下的价值无关紧要,因为在回报中没有考虑count
的值。
如果你展开递归它就变成了
count7( 717) = count(71) +1
(count(7) + 0) + 1
1 + 0 + 1
--------------
2
答案 1 :(得分:2)
你有三个回归陈述
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语句而不是第三个,我想你就是#&# 39;期待。
答案 2 :(得分:0)
跟踪代码的执行情况。当您致电count7(7)
时,它会触发您指出的if语句并设置count = 1
,但之后不会使用count
的值。执行的下一个语句是if (n < 10 && n == 7) return 1
,它退出return
语句上的方法。不使用count的值,因此您所做的更改不会影响方法的执行。