Рекурсивный поворот строки, оценить корректность кода - C (СИ)
Формулировка задачи:
Всем привет.
Закодил следующую ф-ю:
Нужно уточнить следующее:
void ReverseStringRecursion(char *str, int i = 0) {
int size = strlen(str);
if (i < size/2) {
char temp = str[i];
str[i] = str[size - 1 - i];
str[size - 1 - i] = temp;
ReverseStringRecursion(str, i + 1);
}
}1
. По сравнению с for( ; ; ), данный способ, ведь, не самый быстрый и легкий для системы при выполнении?2
. Можно ли утверждать, что задача соответствует сабжу?3
. Как бы вы решили данную задачу?Решение задачи: «Рекурсивный поворот строки, оценить корректность кода»
textual
Листинг программы
#include "greatest.h"
#include <string.h>
void ReverseStringRecursion(char *str, int i) {
int size = strlen(str);
if (i < size/2) {
char temp = str[i];
str[i] = str[size - 1 - i];
str[size - 1 - i] = temp;
ReverseStringRecursion(str, i + 1);
}
}
TEST empty_string()
{
char* string = "";
ReverseStringRecursion(string, 0);
ASSERT_EQ(strcmp(string, ""), 0);
PASS();
}
TEST one_char()
{
char* string = "a";
ReverseStringRecursion(string, 0);
ASSERT_EQ(strcmp(string, "a"), 0);
PASS();
}
TEST two_chars()
{
char* string = "ab";
ReverseStringRecursion(string, 0);
ASSERT_EQ(strcmp(string, "ba"), 0);
PASS();
}
TEST very_long_string()
{
char* string = "The quick brown fox jumps over the lazy dog.";
ReverseStringRecursion(string, 0);
ASSERT_EQ(strcmp(string, ".god yzal eht revo spmuj xof nworb kciuq ehT"), 0);
PASS();
}
TEST two_reversions()
{
char* string = "The quick brown fox jumps over the lazy dog.";
ReverseStringRecursion(string, 0);
ReverseStringRecursion(string, 0);
ASSERT_EQ(strcmp(string, "The quick brown fox jumps over the lazy dog."), 0);
PASS();
}
SUITE(Test_Reverse_String_Recursion)
{
RUN_TEST(empty_string);
RUN_TEST(one_char);
RUN_TEST(two_chars);
RUN_TEST(very_long_string);
RUN_TEST(two_reversions);
}
GREATEST_MAIN_DEFS();
int main(int argc, char **argv) {
GREATEST_MAIN_BEGIN(); /* command-line arguments, initialization. */
RUN_SUITE(Test_Reverse_String_Recursion);
GREATEST_MAIN_END(); /* display results */
}
Объяснение кода листинга программы
- Включаются две библиотеки:
greatest.hи. - Создается функция
ReverseStringRecursion, которая принимает два аргумента:char *strиint i. - Внутри функции происходит вычисление размера строки с помощью функции
strlen. - Затем выполняется проверка: если
iменьше половины размера строки, то происходит обмен симвоновstr[i]иstr[size - 1 - i], после чего рекурсивный вызов функцииReverseStringRecursionс аргументамиstrиi + 1. - Если условие не выполняется, то происходит выход из рекурсии.
- Завершается определение функции
ReverseStringRecursion. - Определяются тестовые функции
TEST empty_string,TEST one_char,TEST two_chars,TEST very_long_string,TEST two_reversions. - В каждой тестовой функции создается строка с заданным значением, вызывается функция
ReverseStringRecursionс аргументамиstringи0, после чего происходит сравнение исходной и перевернутой строк с помощью функцииstrcmp. - Если строки совпадают, то функция
PASSзавершает работу тестовой функции. - В конце определения тестовой функции
TEST two_reversionsсоздается строка с заданным значением, вызывается функцияReverseStringRecursionдва раза с аргументамиstringи0, после чего происходит сравнение исходной и перевернутой строк с помощью функцииstrcmp. - Если строки совпадают, то функция
PASSзавершает работу тестовой функции. - Определяется функция
main, которая принимает аргументыargcиargv, инициализирует их, а затем запускает тестовую функциюTest_Reverse_String_Recursion. - В конце функции
mainвыводится сообщение об успешном завершении работы программы. - Завершается определение функции
main. - Создается файл
greatest.h, который содержит макросы и функции для создания тестовых функций и запуска тестов. - Завершается файл
main.c.