Получение длины экземпляра класса string с использованием рекурсии в C

#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. Теперь я внес необходимые изменения в вопрос.