无法理解Java中的递归

时间:2016-02-23 14:43:25

标签: java recursion

import java.util.Scanner; 

public class findFive {

    public static int count = 0;
    public static String result = null;

    public static void main(String[] args) {
        System.out.println("Enter a nonnegative number");
        Scanner input = new Scanner(System.in);

        int number = input.nextInt();
        countFive(number);
        System.out.println(count);
    }

    public static void countFive(int number) {
        if (number < 10) {// the base case
            if (number == 5) {
                count++;
            }
        } else { // number has two or more digits
            countFive(number / 10);
            if (number % 10 == 5) {
                count++;
            }
        }
    }
}

简单地说,我不理解countFive(int number)方法的流程。我知道如果用户输入 5 ,那么计数将简单地等于1.但是,我的困惑来自于使用'countFive(number / 10)'在方法内再次调用该方法的地方

编辑:如果有人使用像552这样的数字来完成代码流程,我将不胜感激。

4 个答案:

答案 0 :(得分:3)

如果你想看看它是如何工作的,你应该逐步调试调试器中的代码,当你看到它在行动中时会更清楚

该方法计算数字5出现次数的次数。例如,如果您传入数字515,则会发生以下情况

  1. 515大于10
  2. 调用评估为countFive(number/10)
  3. countFive(51)
  4. 51大于10
  5. 调用评估为countFive(number/10)
  6. countFive(5)
  7. 5小于10
  8. 5等于5
  9. 增量count
  10. 走出去
  11. number%10 == 5评估为1%10 == 5 - 错误
  12. 走出去
  13. number%10 == 5评估为5%10 == 5 - True
  14. 增量count

    countFive(515) | 515 greater than 10 | countFive(51) | | 51 greater than 10 | | countFive(5) | | | count++ | | 51 mod 10 does not equal 5 | 515 mod 10 equals 5 | count++

答案 1 :(得分:1)

在递归基础中创建案例以避免对同一方法的无限调用。这是由你在下面定义的。

if (number < 10) {// the base case
   if (number == 5) {
      count++;
   }
}

如果满足此条件,则执行此方法。如果不是这样,则执行else块。

else { // number has two or more digits
    countFive(number/10);  //This is where it is called again
    if (number%10 == 5) {
       count++;
    }
}

在此您可以调用countFive(数字/ 10)

答案 2 :(得分:1)

嗯,该方法计算一个数字中5的出现次数。例如,5123512356将返回3

您只需使用递归删除数字的最后一位,直到达到最高位数(左侧示例中为5)。

一旦你到达它,它将进入number < 10并看到它确实是5.然后它将离开方法并继续51(51%10 = 1),继续使用512512351235count++)等等,直到通过整数。

澄清:number/10被调用以通过删除原始数字的最后一位来达到最高位数,直到您不能再将其除以10为止。然后检查会反过来。

让我们看一个更简单的例子:5050

第一个电话:countFive(5050)。 5050> 10,所以我们打电话:
第二个电话:countFive(5050/10) = countFive(505)。还是大于10 第3个电话:countFive(50)
第4个电话:countFive(5)counter++,号码小于10 现在我们通过这三个电话倒退(最后一个完成)
第3个电话:50 % 10 = 0,counter保持不变 第二个电话:505 % 10 = 5,counter++
第一个电话:5050 % 10 = 0,counter保持不变
之后:counter = 2。

答案 3 :(得分:1)

让我们来看你提出的输入:552并按照方法进行。

开始时计数为0。

number        count     number < 10      number == 5       number % 10 == 5
-----------   -------   --------------   --------------    ------------------
552           0         false            false             false
55            0         false            false             true
              1
5             1         true             true              true
              2

并且它将返回2.基本上,您可以看到该方法计算输入中数字5的出现次数。

您的基本案例检查它是否为数字(< 10),如果是,则检查该数字是否为5.否则,它会切断最右边的数字并再次调用该方法,就好像输入是新的一样数。一旦数字只剩下一个数字,它就会停止。