#python #c #string #recursion
#python #c #строка #рекурсия
Вопрос:
Я пишу рекурсивную функцию для определения длины строки в C . Это простая задача, и я написал две функции на C и одну на Python.
Первый
int length(char *str) {
if (*str == '')
return 0;
return 1 length(str 1);
}
Второй
int get_size(string str, int i) {
if (str[i] == '')
return 0;
return 1 get_size(str, i 1);
}
Python
def length(string):
if not string:
return 0
return 1 length(string[1:])
Все они работают нормально. Но я хочу переписать вторую функцию так, чтобы не было необходимости в integer
аргументе, подобном первому. Я также не хочу использовать переменные static
и global
и любые библиотечные функции, кроме string
экземпляра класса. Как мне переписать вторую функцию как первую?
Комментарии:
1. Почему именно вы это делаете? Помимо простого использования
std::string::length()
напрямую, рекурсия по входным данным всегда является опасной идеей. Однако, если вы настаиваете, идиоматическим способом сделать это в C было бы использоватьstd::string::const_iterator
пару.2. также обратите внимание, что
std::string
не завершается. Он может содержать
в середине. Для такого
std::string
вашегоlength
будет возвращена неправильная длина
Ответ №1:
Эквивалент pythons на C string[1:]
является std::string::substr
:
int get_size(std::string str) {
if (str.empty()) // end of recursion
return 0;
// call recursively with substr from second to last character.
return 1 get_size(str.substr(1));
}
Комментарии:
1. Мне также не разрешено использовать какие-либо библиотечные функции.
2. @Шерлок, которого вы не можете использовать
std:string
, не используя стандартную библиотеку.3. @Sherlock
str.length()
из библиотеки. Если у вас есть ограничения и требования, пожалуйста, укажите их в вопросе4. @Sherlock В этом случае второй пример бессмыслен. Вы не можете использовать часть стандартной библиотеки… без использования стандартной библиотеки.
5. @churill Я должен использовать класс string для создания строки, но мне не разрешено использовать какую-либо функцию класса string. Теперь я внес необходимые изменения в вопрос.