я получил следующий код Дано:Анализ выполнения короткого алгоритма
public class alg
{
public static int hmm (int x)
{
if (x == 1)
{
return 2;
}
return 2*x + hmm(x-1);
}
public static void main (String[] args)
{
int x = Integer.parseInt(args[0]);
System.out.println(hmm(x));
}
}
Так первый вопрос, что же рассчитывать этот алгоритм? Я только что набрал и запустил его в eclipse , поэтому я могу лучше видеть, что он делает (раньше он был псевдокодом, я не мог ввести его здесь, поэтому я набрал код). Я понял, что этот алгоритм делает следующее: он будет принимать входные данные и умножать их на следующий номер. Итак, как примеры:
input = 3, output = 12 because 3*4 = 12.
Or Input = 6, output 42 because 6*7 = 42.
Alright, следующий вопрос, моя проблема. Мне предлагается проанализировать время выполнения этого алгоритма, но я не знаю, с чего начать. Я бы сказал, что в начале, когда мы определяем x, у нас уже есть time = 1
Цикл if дает time = 1
тоже, я считаю. Последняя часть, return 2x + alg(x-1)
должна давать «что-то^x» или ..? Таким образом, в конце концов, мы получили что-то вроде "что-то^х" + 2, я сомневаюсь Вот так:/
редактировать, удалось набрать псевдокод тоже :)
Input: Integer x with x > 1
if x = 1 then
return 2;
end if
return 2x + hmm(x-1);
Поскольку нет циклов, время работы пропорционально количеству рекурсий. Поскольку существует только один шаг рекурсии «hmm (x-1)» и, предполагая 'x> 0', число рекурсий - это просто' x - 1'. – dhke
Вы уверены, что алгоритм возвращает '42' для ввода' 6'? Не возвращает ли алгоритм '2^x * x!'? – Codor
@Codor Если я судья, он должен вернуть 'x² + x'. Он вычисляет двойную арифметическую прогрессию ... через рекурсию. – dhke