Кто-нибудь знает, как выполнить алгоритм итеративно (используя while) для следующего определения?

#java #algorithm #recursion #while-loop

#java #алгоритм #рекурсия #цикл while

Вопрос:

введите описание изображения здесь

(Примечание: «en otro caso» означает в другом случае; нажмите «введите описание изображения здесь, чтобы просмотреть изображение»)

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

 public static Integer eje4ConMemoria(Integer d1, Integer d2, Map<Tuple2<Integer, Integer>, Integer> memoria) {
    Integer result = null;
    Integer a = d1;
    Integer b = d2;
    Tuple2<Integer, Integer> t = Tuple.create(a, b);
    if (memoria.containsKey(t)) {
        result = memoria.get(t);
    } else if (a < 2 amp;amp; b < 2) {
        result = a   b * b;
        memoria.put(t, result);
    } else if (a < 2 || b < 2) {
        result = a * a   b;
        memoria.put(t, result);
    } else {
        result = eje4ConMemoria(a / 2, b - 1, memoria)   eje4ConMemoria(a / 3, b - 2, memoria)
                  eje4ConMemoria(a - 2, b / 4, memoria);
    }
    return resu<
}
 

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

1. И вы начали преобразовывать его для итеративной работы? В чем проблема?

2. Зачем вам это нужно?

3. (В вашей реализации есть дублирование кода. Само по себе это не катастрофично, но скрывает упущение, наносящее ущерб времени выполнения. Или, что еще хуже, преувеличивает преимущества производительности от беспрепятственной итеративной реализации.)

Ответ №1:

Здесь должна работать простая система списков. Конечный результат, если вы расширите любой заданный g(a, b) , — это просто длинный список «вещей, которые нужно добавить вместе». Это будет гигантская цепочка простых значений (например g(6, 2) , становится g(3, 1) g(2, 0) g(4, 0.5) и становится (6^2 2) (2 0) (4^2 0.5) .

Таким образом, вы можете повторно интерпретировать задание как создание списка терминов, которые все еще нуждаются в обработке, плюс ведение подсчета для «обработанных» узлов.

ПРИМЕЧАНИЕ: сначала несколько заметок; Integer неверно, используйте int . Я понятия не имею, почему вы передаете «карту tuple2», Tuple2 это глупо; это вообще не идиоматично, никто * в сообществе Java не пишет подобный код.

NB2: Вы выполняете целочисленное деление, т. Е. Вы говорите это 3 divided by 2 is 1 , а не 1.5. Предположительно, это намеренно. Если это не так, замените ВСЕ вхождения int на with double .

 public static int eje4(int a, int b) {
    class Node {
        final int a, b;
        Node(int a, int b) { this.a = a; this.b = b; }
    }

    Queue<Node> queue = new ArrayDeque<>();
    queue.push(new Node(a, b));

    int result = 0;
    while (!queue.isEmpty()) {
        Node n = queue.pop();
        if (n.a < 2 amp;amp; n.b < 2) {
            result  = (n.a   n.b * n.b);
            continue;
        }
        if (n.a < 2 || n.b < 2) {
            result  = (n.a * n.a   n.b);
            continue;
        }
        
        queue.push(new Node(n.a / 2, n.b - 1));
        queue.push(new Node(n.a / 3, n.b - 2));
        queue.push(new Node(n.a - 2, n.b / 4));
    }
    return resu<
}
 

*) Некоторые клоуны делают, например, vavr , что круто, но это не то, на что похоже подавляющее большинство кода Java. Если вам нравятся такие вещи, scala вам больше понравится.

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

1. Похоже, вы забыли о запоминании. Почему Integer «неверно»?

2. ( Node является многообещающим Tuple2 .)

3. @greybeard но неглобальный и описательный.

4. @superbrain Поставленный вопрос не касается запоминания.

5. Спасибо @rzwitserloot !!!, и я не знаю, почему я должен использовать int. Наконец, пожалуйста, вы не используете такие слова, как клоуны.