2017-02-16 7 views
-2

здесь требование проблемыстранная логика для печати чисел в обратном направлении

написать метод writeNums, который принимает параметр п целого числа и печатает первые п целых числа, начиная с 1 в последовательном порядке, разделенные запятыми. Например, следующие вызовы производят следующий вывод:

Вывод вызова writeNums (5); 1, 2, 3, 4, 5

И вот решение (частично это моя работа и частично, я искал в Интернете). Я не понимаю, почему эта строка writeNums (n - 1); распечатывать номера назад? Это немного сбивает с толку, потому что я ожидал, чтобы получить это напечатано: 5,4,3,2,1

public class WriteNums 
{ 
public static void main(String args[]) 
{ 
WriteNums wn=new WriteNums(); 
wn.writeNums(5); 
} 

public static void writeNums(int n) { 
    if (n == 1) 
     System.out.print("1"); 
    else { 
     System.out.println(n); 
     writeNums(n - 1); 
     System.out.print(", " + n); 
    } 
    } 

} 
+0

Посмотрите в рекурсии, а также стек рекурсивных вызовов – Coder

+0

Что отладчик покажет вам, когда вы шагаете через код? –

+0

, если число не равно 1, оно снова вызывает writeNum (n-1), но тогда почему system.out печатает в обратном порядке? –

ответ

2

его, потому что вы используете рекурсию, а выход распечатанной после вызова функции.

сделать это перед вызовом функции, и вы получите 5, 4, 3, 2, 1

так:

public static void writeNums(int n) { 
    if (n == 1) 
     System.out.print("1"); 
    else { 
     System.out.print(n+", "); 
     writeNums(n - 1); 
     //System.out.print(", " + n); 
    } 
    } 
+0

спасибо! я думаю, что ваш ответ в значительной степени решил мою путаницу. Я буду чистить мои навыки рекурсии. –

+0

рад помочь !, я знаю, что рекурсия может иногда путать. –

+0

можете ли вы принять его в качестве своего ответа? –

0

Программа печатает номера назад, потому что вы просите его для печати числа назад. Посмотрите, что первая итерация в ваших рекурсивных вызовах, вы сначала печатаете n, а затем начинаете с n-1. Если вы хотите напечатать цифры в порядке возрастания, изменить способ что-то вроде следующего:

public static void writeNums(int m, int n) { 
    if(n < 1) return; 
    System.out.print(m); 
    if(m == n) return; 
    writeNums(m+1, n); 
    } 

, а затем из основного метода, вызовите функцию как writeNums(1, <n>);

1

Ваша программа производит следующий вывод:

5 
4 
3 
2 
1, 2, 3, 4, 5 

Почему это так?

5 
4 
3 
2 
1 

Поставляется с линии System.out.println(n);. Вы вызываете writeNums(5), который вызывает тогда writeNums(4), который вызывает writeNums(3) и т. Д. Каждый вызов печатает n на новой строке перед выполнением другого рекурсивного вызова.

Эта часть: , 2, 3, 4, 5 печатается по строке System.out.print(", " + n); после завершения рекурсивного вызова. Так writeNums(2) напечатает , 2 после вызова writeNums(1) возвращается, writeNums(3) напечатает , 3 после вызова writeNums(2) возвратов и т.д.

Если вы хотите, чтобы программа печати 1, 2, 3, 4, 5 просто удалить System.out.println(n); линии.

0

Номера печатаются назад, потому что вы вызываете тот же метод перед тем, как напечатать номер, и он будет работать сам до встречи «if (n == 0)», и в этом случае он завершит сам и сможет продолжить выполнение следующей строки «System.out.print (", "+ n)". Таким образом, этот путь печатает всю последовательность.

public static void writeNums(int n) { 
     if (n == 0){ 
            throw new IllegalArgumentException(); 
        }     
    else if (n == 1) { 
            System.out.print(n); 
        } else { 
            writeNums(n-1); 
            System.out.print(", " + n); 
        } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^