递归函数,局部变量不执行if语句

时间:2015-06-19 17:30:31

标签: java recursion

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.请解释这一个案例,因为这是我唯一无法正确理解的事情。

3 个答案:

答案 0 :(得分: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

答案 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的值,因此您所做的更改不会影响方法的执行。