В этом случае рекурсия кажется более быстрым выбором, потому что строка «проходит» один раз, в то время как обычный подход l oop делает это дважды.
Когда дело доходит до производительность, никогда ничего не предполагайте. Протестируйте оба подхода и измерьте. Но, как показывает опыт, с циклами это быстрее, чем с рекурсией, поскольку рекурсия означает вызовы функций и настройку фреймов стека. Представляет ли рекурсия какой-либо недостаток в случае большого ввода?
В общем, преимущество рекурсии состоит в том, что их легко писать и легко читать. Они очень редко предпочтительнее по соображениям производительности. И их самый большой недостаток в том, что они имеют тенденцию безумно съедать стек.
В этой конкретной ситуации маловероятно, что производительность действительно является проблемой. Но если это так, то также вероятно, что вызов putchar
является самой большой проблемой, потому что вы вызываете его один раз для каждого символа. В этом конкретном примере вам действительно не хватало слона в комнате. Вызов функций может быть дорогостоящим.
Чтобы сделать это как можно быстрее, я бы попробовал следующее:
void printReverse_3(const char *str)
{
const size_t len = strlen(str);
// alloca may blow the stack. Use malloc if you want to use this on
// huge strings
char *tmp = alloca(len + 1);
tmp[len]='\0';
str = &str[len];
for(size_t i=0; i<len; i++) {
str--;
tmp[i] = *str;
}
printf("%s", tmp);
}
Я не пробовал это, но подозреваю, что это быстрее. Вы можете изменить printf
на puts
, поскольку эта функция работает быстрее, но puts
добавляет новую строку позже, поэтому она не будет эквивалентна вашим функциям.