2012-05-12 4 views
3

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

function h(N) { 
    if (N==1) return 3; 
    else { 
     sum = 1; 
     i = 0; 
     while (i < h(N-1)) 
      sum = sum + i; 
      i = i + 1; 
     return sum; 
    } 
} 

По мне, так как ч (N-1) называется многократно в цикле в то время, в то время как контур должен работать столько, сколько раз, как то, что возвращается ч (N-1). Кроме того, вызов функции h (N-1) в цикле while также произойдет много раз. Таким образом, в соответствии со мной, я должен получить что-то вроде этого:

Т (N) = Т (N-1) * H (N-1) + C * H (N-1) + D

где
1. T (N) - это время работы,
2. T (N-1) * H (N-1), поскольку один рекурсивный вызов h (N-1) будет принимать T (N-1), и поскольку он пересчитывается каждый раз при сравнении, он будет называться Н (N-1) раз. (где H (N-1) - это значение, возвращаемое вызовом)
3. и C * H (N-1) - это время выполнения операторов внутри цикла while (так как цикл while запускает H (N- 1) раз.

я не получил удовлетворительного ответа от моего профессора, и я был бы признателен, если кто-то может помочь мне понять это.

Спасибо!

ответ

2

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

function g(N) { 
    if (N==1) return 3; 
    else { 
     sum = 1; 
     i = 0; 
     if(i < g(N-1)) 
      sum = sum + i; 
      i = i + 1; 
     return sum; 
    } 
} 

Здесь мы получаем повторение:

G(N) = G(N-1) + O(1) 

До сих пор, так хорошо? Здесь работа по вычислению g (N) включает решение меньшей задачи g (N-1) плюс постоянный объем работы.

Теперь вернемся к исходной функции h (N). Что изменилось? Теперь работа по вычислению h (N) включает в себя решение подзадачи h (N - 1), h (N-1) раз. И в каждый из этих времен (то есть в цикле while) мы выполняем постоянный объем работы. Существует также еще один постоянный объем работы, который выполняется только один раз в h (N), то есть вне цикла while. Таким образом, мы в основном получаем:

H(N) = H(N - 1) *{H(N - 1) + O(1)} + O(1) 

Мы можем переписать выше, сделав замену T(n) = H(n) + O(1). Таким образом, мы получаем:

T(N) = H(N - 1) * T(N - 1) + O(1) 
+0

Спасибо! Это было действительно полезно. Я понял, как я думал об этом, что дало мне T (N) = T (N-1) * H (N-1) + C * H (N-1) + D на самом деле то же уравнение, что вы упомянули T (N) = T (N-1) * H (N-1) + O (1), так как C * H (N-1) + D является константой. Спасибо за четкое объяснение! – Shobit

1

Предположим, что при выполнении Н (N), значение h (N-1) пересчитывается на каждой итерации цикла (что, вероятно, имеет место для большинства языков и большинства компиляторов)

enter image description here

+0

Спасибо, но это решение - то, что у меня уже есть у моего профессора. Если бы вы могли объяснить мне, как получить уравнение (особенно второй термин C * T (N-1)), это было бы более полезно. – Shobit

+0

@Shobit: c * h (n-1) истинно или c * T (n-1) ... я считаю, что c * h (n-1) истинно ... и где ответ непонятен ? (извините, я не очень хорошо говорю по-английски) –

+0

Спасибо за ответ, amin k. Ответ, который у меня есть, - именно то, что Джек опубликовал выше, как его ответ (с добавлением строки «где C и D - константы», что совершенно очевидно). – Shobit

Смежные вопросы