繁体   English   中英

无法理解Java中的递归

[英]Having trouble understanding recursion in Java

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这样的数字进行编码,我将不胜感激。

如果您想了解它是如何工作的,则应该逐步调试程序中的代码,当您看到它在运行时,它将更加清晰

该方法计算数字5在数字中出现了多少次。 例如,如果您输入数字515 ,则会发生以下情况

  1. 515大于10
  2. 调用计算为countFive(51) countFive(number/10) countFive(51)
  3. 51大于10
  4. 调用计算为countFive(5) countFive(number/10) countFive(5)
  5. 5小于10
  6. 5等于5
  7. 增量count
  8. 走出去
  9. number%10 == 5 ,其结果为1%10 == 5错误
  10. 走出去
  11. number%10 == 5 ,得出5%10 == 5
  12. 增量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++

在递归中,创建基本情况是为了避免无限调用同一方法。 这是您在下面定义的。

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(number / 10)

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

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

一旦已经达到了它,它会进入number < 10 ,并认为它确实是一个5。然后将离开该方法,并用持续51 (51%10 = 1),与继续512512351235count++ )依此类推,直到与整数相乘为止。

需要说明的是:通过删除原始数字的最后一位,直到不再不能将其除以10为止,才能调用number/10以达到最高位数。 然后支票倒退。

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

第一次调用: countFive(5050) 5050> 10,因此我们调用:
第二次调用: countFive(5050/10) = countFive(505) 仍大于10
第三次致电: countFive(50)
第四次调用: countFive(5)counter++ ,数字小于10现在我们向后浏览这三个调用(最后一个完成)
第三次通话: 50 % 10 = 0, counter保持不变
第二次通话: 505 % 10 = 5, counter++
第一次通话: 5050 % 10 = 0, counter保持不变

之后: counter = 2。

让我们接受您建议的输入: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。否则,它将截断最右边的数字并再次调用该方法,就像输入的是该新数字一样。 一旦只剩下一位数字,它就会停止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM