Разработать рекурсивную функцию - C++

Разработать рек. функцию , возвращающая значение: для вычисления суммы цифр в строке. С помощью этой функ. определить в какой из двух строк сумма цифр больше.
Как сделать тоже самое только не через char а через string .

#include <iostream>

int Rec_f(char *str)
{
    return (*str == '\0') ? 0 : ((*str >= '0' && *str <= '9') ?  *str - 48 + Rec_f(str+1) : Rec_f(str+1));
}

int main()
{
    char *str1 = "1111 ";
    char *str2 = "4421";

    if (Rec_f(str1) > Rec_f(str1))
        std :: cout << "1_string";
    else
        std :: cout << "2_string";

    return 0;
}

Ух ты! Такого кривого кода я давно не видел. Для полного кайфа не хватает приписки, что программа работает, но не вседа правильно :lol:

Кстати неплохая задачка для разминки для мозгов. Модератор, может организуете?

//ать!
int foo(char const *str1)
{
    if (*str) {
        return foo(str + 1) + isdigit(*str)? *str - '0': 0;
    }
    return 0;
}

.

//сразу для двух строк
int foo(char const *str1, char const *str2)
{
    if (!(*str1 || *str2)) {
        return 0;
    }
    int x1 = isdigit(*str1)? (*str1 - '0'): 0;
    int x2 = isdigit(*str2)? (*str2 - '0'): 0;
    return (x1 - x2) + foo (*str1?str1 + 1: str1, *str2?str2 + 1: str2); 
}

Croessmah, версия //ать! не работает. Там скобки еще нужны. И в названии формального параметра опечатка. И вообще-то перед разыменованием надо бы проверить переменную на NULL/nullptr.

Там скобки еще нужны. И в названии формального параметра опечатка.

Точно!

И вообще-то перед разыменованием надо бы проверить переменную на NULL/nullptr.

Достаточно неразумная идея в данном случае.
Проверку должен делать уровень выше, т.е.
правильность данных гарантируется вызывающей стороной.
Если не хочется возлагать на пользователя
такую великую ответственность, то можно
экспортировать proxy-функцию с проверкой,
а эту функцию наружу не выдавать.

Аналог с std::string:

int sum_digits(const std::string & str, size_t start = 0) {
    if (start < str.length()) {
        return sum_digits(str, start + 1) + (isdigit(str[start]) ? str[start] - '0' : 0);
    }
    return 0;
}

Я тоже сначала написал версию с указателями. Она почти такая же, как у Croessmah, но с if-ом, поэтому выглядит длиннее. Поэтому для версии со string выбрал более короткий вариант.

но с if-ом, поэтому выглядит длиннее. Поэтому для версии со string выбрал более короткий вариант.

Нет ничего плохого в длинном коде,
если он понятен и хорошо делает свою работу.

А по теме. Наверное, стоило еще заюзать локали,
чтобы учитывать цифры, отличные от наших привычных.

Кстати на счет локалей интересный момент. Продемонстрируете?

Продемонстрируете?

Хотел было сделать,
но, видимо, немного переоценил
возможности стандартных локалей.
Во всяком случае, потоки не осиляют
перевод римских чисел в целочисленное.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.