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.

0
Stephen-Wisniewski 23 Фев 2016 в 17:43

4 ответа

Лучший ответ

Если вы хотите увидеть, как это работает, вы должны пройти через код в отладчике, это будет намного понятнее, когда вы увидите его в действии.

Метод подсчитывает, сколько раз цифра 5 встречается в числе. Например, если вы передадите число 515, произойдет следующее

  1. 515 больше 10
  2. Вызов countFive(number/10), который оценивается как countFive(51)
  3. 51 больше 10
  4. Вызов 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++

3
Eamonn McEvoy 23 Фев 2016 в 16:54

Возьмем предложенные вами исходные данные: 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. В противном случае он отрезает самую правую цифру и снова вызывает метод, как если бы ввод был этим новым числом. Он останавливается, когда в номере остается только одна цифра.

1
Ori Lentz 23 Фев 2016 в 14:55

В рекурсии базовый случай создается, чтобы избежать бесконечных вызовов одного и того же метода. Это определено вами ниже.

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)

1
Nikitha Vangala 23 Фев 2016 в 14:47

Итак, метод считает появление 5 в числе. Например, 5123512356 вернет 3.

Вы просто используете рекурсию, чтобы удалить последнюю цифру числа, пока не дойдете до самой высокой цифры (5 в примере слева).

Как только вы дойдете до него, он перейдет в number < 10 и увидит, что это действительно 5. Затем он выйдет из метода и перейдет к 51 (51% 10 = 1), продолжит с {{ X2}}, 5123, 51235 (count++) и так далее, пока не будет выполнено целое число.

Для пояснения: number/10 вызывается для достижения наивысшей цифры путем удаления последней цифры исходного числа до тех пор, пока вы не сможете больше разделить ее на 10. А затем проверки проходят в обратном порядке.

Давайте посмотрим на более простой пример: 5050.

1-й звонок: countFive(5050). 5050 & gt; 10, поэтому мы звоним:
2-й звонок: countFive(5050/10) = countFive(505). Все еще больше 10
3-й звонок: countFive(50)
4-й звонок: countFive(5): counter++, номер меньше 10 теперь мы перебираем эти три вызова назад (последний завершен)
3-й вызов: 50 % 10 = 0, counter остается прежним
2-й звонок: 505 % 10 = 5, counter++
1-й вызов: 5050 % 10 = 0, counter остается прежним

Затем: counter = 2.

1
LordAnomander 23 Фев 2016 в 14:54