Как найти рекурсивное отношение этой рекурсивной функции?

#java #recursion #time-complexity #analytics

#java #рекурсия #временная сложность #аналитика

Вопрос:

Здесь у меня есть такая функция, и я хочу найти рекурсивное отношение к ней, а после этого вычислить временную сложность этого рекурсивного отношения.

  public static void f(int n) {
    if (n == 1) {
        //" Do sth "
    } else {
        for (int i = 1; i < n; i  ) {
            f(i - 1);
            //" Do sth "
        }
    }
}
  

на самом деле я много пытался для этого, и я получил T (n) = n * f (n-1) для этой функции в качестве отношения, но я не уверен в этом. не могли бы вы помочь мне найти правильное отношение и решить его?

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

1. Обратите внимание, что временная сложность будет выражением n , а не чем-то связанным f() : итак, начните выписывать прогоны для небольшого числа n: сколько раз выполняется f() при n = 1, n = 2, …, вплоть до n = 10? На самом деле выписать цепочку вызовов, чтобы получить представление о том, как ведет себя этот код, можете только вы, после чего вряд ли мы вам еще понадобимся =)

2. И не забудьте добавить вклад " Do sth " .

Ответ №1:

Предполагая, что T(1) = «Do sth» является постоянной работой, т. Е. Не зависит от размера ввода n , вы можете записать рекурсивную функцию времени как :

 T(n) =  T(1)   T(2)   ...   T(n-1)
     =  { T(1) }    { T(1) }   { T(1)   T(2) }   { T(1)   T(2)   T(3) }   { T(1)   T(2)   T(3)   T(4) }  ....

     [let T(1) = x]

     =  x   x   {x   x}   {x   x   (x   x)}   {x   x   (x   x)   x   x   (x   x)}  ....

     = x   x   2x   4x   8x   ...

     ~ x.2^(n-2)

     ~ O(2^n)
  

Вот программа на python для демонстрации последовательности коэффициентов для суммирования:

 t = [0 for i in range(10)]
for i in range(1,10):
  if i == 1:
    t[i] = 1
  else:
    val = 0
    for j in range(1,i):
      val  = t[j]
    t[i] = val
print(t[1:])
  

печатает : [1, 1, 2, 4, 8, 16, 32, 64, 128]

Вы можете видеть, что 2 (n-2) для n> = 2 выполняется при каждом ‘n’, а сложность равна O (2 n)

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

1. Проверьте это еще раз, фактическое время выполнения равно O (phi ^ n), где phi — золотое сечение 1,618 … .

2. @templatetypedef Вместо этого я обнаружил, что сложность равна 2 ^ n. Пожалуйста, проверьте ответ и, если нет, исправьте его, пожалуйста.