Страница 1 из 1
Программка с рекурсией. Помогите, пожалуйста.
Добавлено: 01 мар 2005, 22:47
mike03
Пож-та помогите, легкая задачка, а чего то никак не получается. Вот условие:
Требуется написать рекурсивную функцию, которая принимает символ и строку. Надо вычислить сколько раз этот символ встречается в строке.
Спасибо!!!
Добавлено: 02 мар 2005, 10:46
WinMain
Вообще-то считать символы в строках лучше обычным циклом, но если уж тебе именно рекурсия понадобилась, то получи:
Код: Выделить всё
#include <iostream.h>
void SymbolCount(const char *str, int c, int &count)
{
if (*str == '\0')
return;
if (*str == c)
++count;
SymbolCount(str+1, c, count);
}
int main(int argc, char* argv[])
{
char str[] = "Welcome to the Visual Studio!";
int count = 0;
SymbolCount(str, 'o', count);
cout << count << endl;
return 0;
}
Добавлено: 02 мар 2005, 12:42
mike03
To WinMain:
спасибо, так сделать я знаю, но условие было что функция принимает только строку и симпвол, без счетчика. в этом у меня вся проблема.
Добавлено: 02 мар 2005, 13:18
WinMain
Вот вариант без внешнего счётчика:
Код: Выделить всё
#include <iostream.h>
int SymbolCount(const char *str, int c)
{
if (*str == '\0')
return 0;
int res = SymbolCount(str+1, c);
if (*str == c)
return res + 1;
else return res;
}
int main(int argc, char* argv[])
{
char str[] = "Welcome to the Visual Studio!";
cout << SymbolCount(str, 'o') << endl;
return 0;
}
Добавлено: 02 мар 2005, 13:23
Kolinus
а глобальный счетчик ввести не с руки ??
или это тоже в задаче оговорено?
Добавлено: 02 мар 2005, 17:50
mike03
To Kolinus:
это не оговорено. а как это?
дело в том, что задача была такова, чтобы написать как бы просто отрывок из программы, в данном случае функцию с заданными входными данными и ничего более.
Добавлено: 02 мар 2005, 18:35
WinMain
Для данной задачки может и не играет особой роли, где будет находиться переменная счётчика, но а вообще это весьма порочная практика использовать глобальные переменные для хранения каких-то промежуточных значений. В данном случае если функцию в программе вызывать несколько раз, то перед каждым вызовом функции нужно будет обнулять счётчик.
Любую переменную нужно стремиться локализовать по мере её актуальности (т.е. внутри функции, класса или отдельного блока операторов), а ещё лучше свести количество переменных к минимуму.
Среди большого количества функций стандартной библиотеки С++ или Win32API вряд ли найдётся хотя бы десяток таких, которые требуют явной инициализации каких-то глобальных переменных.
Если мой последний вариант функции оптимизировать, то можно вообще обойтись без промежуточной переменной:
Код: Выделить всё
int SymbolCount(const char *str, int c)
{
return (!*str)? 0 : (*str == c)? SymbolCount(str+1, c)+1 : SymbolCount(str+1, c);
}
Не даром говорится: краткость - сестра таланта.
Добавлено: 09 мар 2005, 09:57
Hup
WinMain, блин... Классно завернул
