возвращая логическое значение из рекурсивного метода - PullRequest
0 голосов
/ 23 января 2020

это дополнительный вопрос, связанный с вопросом, который я задавал недавно. У меня есть следующий рекурсивный код, который даст мне наибольшее число из списка целых чисел

     static int maximum (List<Integer> a)
 {


 if ((a.getTail().isEmpty()))
     return 0;
 else {
         int n = maximum(a.getTail());
         System.out.println(n);

         if (a.getHead() > n) {
            return (a.getHead());
        } else {
            return m;

            }}

 }

Это полезно. Но я действительно хочу иметь возможность возвращать логическое значение true или false в зависимости от того, где список увеличивается или уменьшается. Таким образом, мой метод стал бы:

     static boolean maximum (List<Integer> a)
 {


 if ((a.getTail().isEmpty()))
     return true;
 else {
         int n = maximum(a.getTail());
         System.out.println(n);

         if (a.getHead() > n) {
            return true;
        } else {
            return false;

            }}

 }

Но это не будет работать. Проблема, с которой я столкнулся, состоит в том, что рекурсивный вызов, как я написал, возвращает целое число, чтобы я мог сравнить предыдущий максимум с текущим максимумом ----- if (a.getHead ()> m).

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

Так что для Например, если при рекурсии список постоянно увеличивается, то логическое значение остается истинным, но если в какой-то момент оно уменьшается, оно выдаст ложное значение:

1,2,3,4 = true

1,2,4,3 = false

Спасибо за вашу помощь. Я действительно борюсь со всей концепцией рекурсии .....

Ответы [ 2 ]

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

Некоторые вещи, которые вы, возможно, пропустили:

в функции, оператор возврата немедленно завершает (break) функцию. Таким образом, в

if(...) { return ...; }
else {...}

→ else является избыточным, как если бы условие выполнялось, функция уже завершена (break)

Что-то вроде a==0 имеет логическое значение значение (true или false). Так что

if(i==0) { return true; }
else { return false; }

можно сократить до return count==0;

Я рекомендую всегда использовать фигурные скобки, потому что что-то вроде if(i==0) ++i; break; означает if(i==0) {++i;}. break; будет вызываться в любом случае.

то, что вы хотите, выглядит примерно так:

static boolean is_sorted(List<Integer> list)
{
  return is_sorted_from(0, list);
}

static boolean is_sorted_from(int index, List<Integer> list)
{
  if(index+1 >= a.size()) { return true };
  return list.get(index) < list.get(index+1)
         && is_next_sorted(index+1, list);
}
0 голосов
/ 23 января 2020
static boolean maximum (List<Integer> a, boolean cont){
    if(cont){
           if ((a.getTail().isEmpty())){
               cont = false;
        }else {
            int n = maximum(a.getTail());
            System.out.println(n);
            if (a.getHead() > n) {
               maximum(a.getHead(), cont);
            } else {
               maximum(n, cont);
            }
        }
    }  
    return cont;
}

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

Вы бы просто вызвали метод с помощью cont имея значение истины. Используя два параметра, вы можете продолжить сравнение своей функции max, одновременно используя логическое значение в качестве флага рекурсии. Однако вы не сможете вернуть свой максимум, но вы можете обойти это, установив максимум либо для экземпляра класса, либо для объекта, который у вас есть в качестве третьего параметра (Double, Integer, et c.).

...