Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2016, 14:41   #1
Dmitriy1991
Пользователь
 
Регистрация: 22.11.2016
Сообщений: 11
По умолчанию C++, Избавиться от реккурсии

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

if(board[i][j]==0)
Вызываю рекурсию
Код:
void go(int i, int j, int count, int **board, int N, int M)
{
	board[i][j] = count;
	if (i < N - 1 && j < M - 1)
	{
		if (board[i + 1][j + 1] == 0)
		{
			go(i + 1, j + 1, count, board, N, M);
		}
	}
	if (i < N - 1 && j > 0)
	{
		if (board[i + 1][j - 1] == 0)
		{
			go(i + 1, j - 1, count, board, N, M);
		}
	}
	if (i > 0 && j > 0)
	{
		if (board[i - 1][j - 1] == 0)
		{
			go(i - 1, j - 1, count, board, N, M);
		}
	}
	if (i > 0 && j < M - 1)
	{
		if (board[i - 1][j + 1] == 0)
		{
			go(i - 1, j + 1, count, board, N, M);
		}
	}
}

Последний раз редактировалось Dmitriy1991; 22.11.2016 в 14:49.
Dmitriy1991 вне форума Ответить с цитированием
Старый 22.11.2016, 15:44   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Dmitriy1991 Посмотреть сообщение
хочется избавиться от рекурсии
Зачем?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 22.11.2016, 19:21   #3
Dmitriy1991
Пользователь
 
Регистрация: 22.11.2016
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Зачем?
При большом значении N происходит переполнение стека
Dmitriy1991 вне форума Ответить с цитированием
Старый 22.11.2016, 21:58   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Использовать стек/очередь.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 22.11.2016, 23:23   #5
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

goto использовать
come-on вне форума Ответить с цитированием
Старый 23.11.2016, 14:39   #6
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

....и никто не посоветовал использовать мозг))

1) если первый вызов имеет вид:
void go(int i, int j, НОЛЬ, int **board, int N, int M)
то рекурсия будет вечной и, конечно же, не хватит памяти... думаю, стоит ставить не 0, а 1

2) текущий код просто заполняет некую свободную область доски значением count... если это правильное поведение, то стоит погуглить "алгоритмы заливки" и подобрать вариант под себя..... если же нужно найти кол-во шагов от i, j до всех остальных точек, то нужно, как минимум, в коде прописать count + 1 и см. п.1
кроме того, если действительно нужно кол-во шагов и\или путь между точками, то гугли "алгоритм A*"
GreenWizard вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Избавиться от рекурсии a.n.o.n.i.m C# (си шарп) 7 26.09.2016 23:30
Избавиться от chdir flyingbudda БД в Delphi 13 22.04.2014 11:30
Избавиться от BlueScreen Анастасия2013 Windows 5 30.01.2013 09:59
Как избавиться от #Н/Д? kachorro Microsoft Office Excel 10 26.04.2012 06:38
Избавиться от нагромождения IF fezilk25 Общие вопросы Delphi 9 17.11.2010 20:30