Страница 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, блин... Классно завернул :)