-2

Рассмотрим две функции, которые принимают в качестве параметра целое число без знака и возвращают количество цифр этого числа. Одна функция рекурсивна, а другая нерекурсивна.Сложность времени и пространства рекурсивного и нерекурсивного малого алгоритма

С точки зрения сложности, какая реализация лучше?

Используемый язык - C/C++.

Здесь не-рекурсивная функция:

int nbOfDigitsNR(int nb) { 
int i=0 
while(nb!=0){ 
nb=nb/10; 
++i; 
} 
return i; // i is the number of digits 
} 

рекурсивная функция:

int nbOfDigitsNR(int nb) { 
static int i; 
if (nb!=0){ 
i=i+1; 
nbOfDigitsNR(nb/10);} 
return i; 
} 

Я полагаю, что временная сложность такой же: О (п), и сложность пространства другое: O (n) рекурсивное. O (1) нерекурсивный.

+0

Вы можете использовать алгоритм O (1) для числа цифр: 'numDigits (x) {return floor (log_10 (x) +1)}' – halex

+0

Я думаю, что для временной сложности оба являются O (n), где n это число итераций !!!!! – ZEMA

+0

Покажите нам свои реализации вместе с вашими предположениями и аргументами, которые укрепляют их для их сложности, тогда мы можем обсудить их. Мы не будем делать домашнее задание без вашего умственного участия. – halex

ответ

0

Говоря о том, что функция рекурсивна или нерекурсивна, не сообщает нам что-то о ее сложности.

Он может быть равен или один из них с меньшей сложностью .. он полностью зависит от алгоритма.

У меня есть синий и серый автомобиль. Какой из них быстрее?

+0

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

+0

@icepack: nope .. например, если это хвост рекурсивный, эта сложность может быть устранена. –

+0

Хорошая точка, хотя это оптимизация, зависящая от компилятора. – SomeWittyUsername

0

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

Разница заключается в сложности пространства и как язык программирования в вашем случае C++ обрабатывает рекурсию.

Ваш пример иллюстрирует именно это. Обе функции будут иметь одинаковую сложность по времени, тогда как рекурсивная будет иметь большую сложность пространства, поскольку C++ выделяет переменные для каждого рекурсивного вызова в стеке.

Вы в праве в том, что касается времени и пространства, если n представляет собой число цифр. Если n представляет целое число, замените его на lg (n).

+1

вот мои коды, что ты думаешь ??? – ZEMA

+0

@ ZEMA: Ну, это явно неверно. избавиться от этой переменной 'static'. –

+1

@ KarolyHorvath, но он отлично работает !!! как насчет предложений сложности? – ZEMA

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

  • Нет связанных вопросов^_^