Создание рекурсивного метода для печати текста в java - PullRequest
1 голос
/ 23 февраля 2020

Я должен сделать программу, которая работает следующим образом. сначала он получает число из ввода, а затем получает (число) * строк.

, например:

2
a b

или

3
x1 x2 x3

, затем на выходе печатает что-то вроде этого:

Math.max(a, b)

или

Math.max(x1, Math.max(x2, x3))

Я хочу сделать синтаксис метода Math.max с этим кодом. Я надеюсь, что вы поняли!

Другой пример ввода и вывода:

Вход =

4
a b c d

Выход =

Math.max(a, Math.max(b, Math.max(c, d)))

Может кто-нибудь мне помочь?

Код, который я написал для него, можете ли вы предложить мне некоторые изменения, чтобы сделать его лучше?

import java.util.*;

public class Main {
  public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    int n = input.nextInt();
    String[] r = new String[n];
    for (int i = 0; i < n; i++) {
      r[i] = input.next();
    }
    printmax(r);

  }
  public static int i = 0 , j = 0;
  public static boolean last = false;
  public static void printmax(String [] r){
    if (last == true) {
      System.out.print(r[r.length - 1]);
      while (j < r.length - 1){ System.out.print(")");
        j++;
      }
    }
    if (r.length == 2) System.out.print("Math.max(" +r[0] + ", " + r[1] + ")");
    if (r.length > 2) {
      while (i < r.length -1) {
        if (i == r.length -2) last = true;
        System.out.print("Math.max(" + r[i] + ", ");
        i++;
        printmax(r);
      }
    }
  }
}

Ответы [ 2 ]

3 голосов
/ 23 февраля 2020

Вы можете использовать следующий код для достижения вышеизложенного, здесь m рекурсивно вызывает функцию maxElement () для достижения чего-то подобного Math.max (a, Math.max (b, Math.max (c, d)) )

public static void main(String args[]){
    int length = 2; //here read the input from scanner
    String[] array = {"a", "b"}; //here read this input from scanner
    String max = maxElement(array,0,length);
    System.out.println(max);
}

public static String maxElement(String[] start, int index, int length) {
    if (index<length-1) {
        return "Math.max(" + start[index]  +  ", " + maxElement(start, index+1, length)+ ")";
    } else {
        return start[length-1];
    }
}

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

Вывод: Math.max (a, b)

1 голос
/ 23 февраля 2020

Вам нужно сделать что-то подобное.

Сначала вы определяете функцию maxElement, которая принимает ваш массив переменных в качестве параметра.

public static maxElement(String[] variables) {
    return maxElementBis(variables,0);
}

Затем вы вызываете вторую функцию: maxElementBis, которая принимает дополнительный аргумент, который представляет индекс переменной, которую мы обрабатываем .

public static String maxElementBis(String[] variables, int index) {
    if (variables.length < 2) 
        return "not enought variables";
    if (variables.length - index == 2)
        return "Math.max("+ variables[index]+","+variables[index + 1]+")";
    return "Math.max("+ variables[index]+","+maxElementBis(variables,index + 1)+")";

}

Если массив содержит менее двух переменных , вы не можете делать то, что хотите.

Если у вас осталось только две переменные , это ваше условие остановки, и вы можете напрямую вернуть Math.max(v1,v2).

В противном случае вы рекурсивно вызываете свою функцию maxElementBis.

...