Java для преобразования цикла в рекурсивную функцию

#java #recursion #for-loop #while-loop

#java #рекурсия #for-цикл #цикл while

Вопрос:

 public class For {
 public static void main(String[] args){
          for(int i=2; i<=1024; i *= 2){
           System.out.println("Count is: "   i);
      }
 }




public class While {
    public static void main(String[] args){
        int i = 1;
        while (i < 1024) {
            i *= 2;
            System.out.println("Count is: "   i);
      }
 }


public class DoWhile {
     public static void main(String[] args){
        int i = 1;
        if (i < 1024) {
            do { i*=2;
                System.out.println("Count is: "   i);
            } while (i < 1024);
        }
     }
  

Как бы преобразовать цикл for / while, чтобы он выполнял то же самое, но с использованием рекурсивной функции?

Комментарии:

1. Пожалуйста, отметьте это также как домашнее задание, если оно одно

2. Если это домашнее задание, пожалуйста, укажите это, добавив тег homework.

Ответ №1:

Вот так:

 public class Recursive {
    public void r(int i) {
        if (i < 1024) {
            i *= 2;
            System.out.println("Count is: "   i);
            r(i);
        }
    }

    public static void main(String[] args) {
        Recursive r = new Recursive();
        r.r(1);
    }
}
  

Комментарии:

1. -1 за то, что не помог. Предоставление студентам возможности решить поставленную задачу полезно, а подавать им решение на серебряном подносе — нет, ИМХО. Почему Manpreet Pangli должен когда-либо заботиться о том, чтобы слушать своего профессора, когда получить ответ от SO так дешево?

2. Это приводит к результатам, отличным от примеров в вопросе OPs. Ваша программа начинает печать с 1. Умножение на 2 должно быть выполнено перед println.

3. @Ingo: Я не знал, что это домашнее задание. Нет тега homework. Я думаю, что несправедливо давать ответы -1 не потому, что они неправильные, а потому, что они были даны для «вопросов домашнего задания».

4. @Ingo: с вашей точкой зрения трудно поспорить, хотя она немного субъективна!

5. Да, @David, я забочусь о программистах следующего поколения, даже если они из Индии. И я не могу этого вынести, если людям сойдет с рук избегание мышления.

Ответ №2:

Возьмите цикл main и поместите его в его собственную функцию с аргументом int i . В этой функции перепишите цикл на

  1. Если условие цикла равно false ( i >= 1024 ), то return
  2. Иначе, рекурсивный вызов с аргументом i*2 .

Вызовите функцию с аргументом 1 или 2 , в зависимости от того, какую из ваших программ вы переписываете (они не полностью совпадают).

Ответ №3:

Рекуррентный цикл может выглядеть следующим образом:

 class Main
{
    public static void main(String[] args){
      RecWhile(1);
    }

    public static void RecWhile(int i) {
       if (i < 1024) {
         i = i*2;
         System.out.println("Count is: "   i);
         RecWhile(i);
       }
    }
}
  

Комментарии:

1. Этот ответ отмечен -1 не потому, что он неверен, а ПОТОМУ, что он был дан на вопрос, на который не предполагалось отвечать таким образом (конечно, это не мой POV; но так оно и есть в Stack Overflow)

2. Нет, это я, не ТАК. Если вы не видите, что это может быть только домашним заданием, я ничего не могу с этим поделать.

Ответ №4:

открытый класс Test1 {

 public static void main(String[] args) {

    Test1 mainFunc = new Test1();

    int[] arr = {1,2,4,3,5,6};

    int start=0;
    int end=arr.length;
    mainFunc.callRecursiveFun(start, end, arr);
}

public int callRecursiveFun(int start, int end, int[] arr) {
    int arrLen = end;
    if(arrLen == 0) {
        return 0;
    } else {

    System.out.println("Loop Index at " start  ": " arr[start]);


    }
    return callRecursiveFun(start 1, end-1, arr);
}
  

}