Рекурсивная функция в Clojure - PullRequest
0 голосов
/ 29 мая 2019

Я написал рекурсивную функцию в Java и хочу реализовать то же самое для Clojure.

Ниже приведен фрагмент кода Java.

private boolean solve(int i, int j) {
    // some other code
    if ((solve(i - 1, j)) == true) {
        return true;
    }
    if ((solve(i, j + 1)) == true) {
        return true;
    }
    // some code!!!!
    return false;
}

Как это можно реализовать в Clojure?

1 Ответ

1 голос
/ 31 мая 2019

почти прямой эквивалент

(defn solve [i j]
  (or ;; some other code
      (solve (dec i) j)
      (solve i (inc j))
      ;; some code
      ))

Обратите внимание на отсутствие оператора return - все является выражением.

В вашем java-фрагменте «некоторый другой код» должен иметь возможность возвращать truey, в противном случае вы получите переполнение стека (вместо «бесконечной рекурсии»).

Причина, по которой код может быть настолько коротким, заключается в том, что макрос or выполняет оценку коротких замыканий (т. Е. Останавливает оценку, как только может быть получен значимый результат).

В примере clojure «некоторый другой код» должен быть выражением, которое может принимать значение false или ноль.

Если вам нужно "немедленно вернуть false" из "какого-то другого кода", ваше выражение должно быть немного более запутанным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...