Как можно справиться с циклически рекурсивным отношением?

#algorithm #language-agnostic #dynamic-programming

#алгоритм #язык не зависит #динамическое программирование

Вопрос:

Я застреваю, когда возникает такая проблема:

Предположим, я хочу найти foo(n) . Я знаю формулу для foo(n) , но она включает в себя оба foo(n-1) и foo(n 1) в его вычислении.

Если бы я попытался решить их с помощью наивной рекурсивной функции, то эти два вызова функции снова вызывали бы родительскую функцию через них. Это привело бы к бесконечному циклу! например, попытка решить foo(n) будет включать вызов foo(n 1) , который будет вызывать обратный foo(n) вызов , и так далее.

Существует ли общий метод для решения этого конкретного типа проблем, не полагаясь на какие-либо предположения о точном вычислении foo(n) из foo(n-1) и foo(n 1) ?

Редактировать:

В моем примере я знаю foo(n) = 0 и foo(n-1) = 1 для конкретного n , и я хочу вычислить все значения между foo(n-2) и 0 .

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

1. Это не является четко определенной проблемой, ни математически, ни вычислительно. Что вы пытаетесь вычислить?

2. Есть ли какой-либо верхний предел для остановки foo?

3. «Как решаются такие проблемы в программировании?» Например. указание s.th . например, максимальная глубина рекурсии.

4. @G.Bach Да, это хороший момент в базовых случаях. Итак, теперь мы на одной странице? В вопросе слишком мало информации, чтобы ответить на него.

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

Ответ №1:

На самом деле решение этой проблемы очень простое. Если у вас есть отношение, что-то вроде:

 f(n) = f(n 1) - f(n-1)
  

Все, что вам нужно сделать, это вычесть положительное k значение из каждого из внутренних членов, чтобы ни один член не был функцией чего-либо выше n . Например, в этом случае k было бы 1 :

 f(n-1) = f(n) - f(n-2)
  

Затем перестановка получает:

 f(n) = f(n-1)   f(n-2)
  

Который вы могли бы распознать как последовательность Фибоначчи. Это всего лишь пример, не имеет значения, какая связь между f(n) , f(n 1) и f(n-1) , пока это функция, которую вы можете отменить, вы всегда можете сместить аргументы функции, чтобы преобразовать ее в функцию f(n) , f(n-1) и f(n-2) . Другой пример:

 f(n) = f(n 1) / f(n-1)
f(n-1) = f(n) / f(n-2)
f(n) = f(n-1) * f(n-2)
  

В более общих чертах, если у вас есть:

 f(n) = H[f(n 1), f(n-1)]
  

Затем вы можете преобразовать это в:

f (n) = H-1[f (n-1), f (n-2)]

Где H — функция, а H-1 — ее обратная.

Это предполагает, что у вас есть два значения на нижней границе и вы хотите сделать шаг вверх. (например f(0) = 1, f(1) = 1 ). Если у вас есть верхние границы и вы хотите уйти, тогда вы бы добавили k вместо вычитания

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

1. пользователь2732146 не указал, является ли f (n) суммой, произведением, разностью или чем-то еще из f(n 1) и f (n-1). Хотя я ожидаю, что это будет то, что он в конечном итоге скажет, мы не знаем этого прямо сейчас.

2. @G.Bach Но это не имеет значения. Каким бы ни было отношение, вы можете сделать то же самое. Это был просто пример. Если бы это было f(n)=f(n 1)f(n-1) так, опять же, вы могли бы перенести это на f(n-1) = f(n)f(n-2) предоставление f(n) = f(n-1)/f(n-2)