LINUX.ORG.RU

[Java] рекурсия - вернуться на определённый фрейм

 


0

1

задали задачку про рекурсию, не могу понять до конца как она работает :)

есть функция, которая состоит из 4-х if-else условий, если одно из них true, то функция зовёт сама себя, если все false, то функция возвращает то, что она сделала в обратную сторону :) другими словами, при каждом true создаётся новая координата (объект ходит по лабиринту), и если он заходит в тупик, то начинает «идти» обратно. Я не пойму как мне выйти из тупика (отойти до определённого фрейма в стеке), и пойти «дальше», но уже в другом направлении, а не отматывать всё до самого начала.

функция проверяет «куда можно пойти» последовательно: «влево, вниз, вправо, вверх»;

примерный код:

void go(int x, int y) {
		
	Coordinate currentCoordinate = new Coordinate(x, y);
	
        показатьГрафику();
		
		thereIsWall(x -= 1, y); // возвращает boolean, если -один влево по оси Х стена;
		thereIsMe(x, y); //возвращает boolean, если мы там уже были
		
		if (wall != true && me != true) {
				route.addOneAfterRow(currentCoordinate); 
			идём(x, y);
			
			go(x, y); // зовём функцию по новой
			
			стереть(x += 1, y); // стереть когда будет return;
			
		} else {

			wall = false;
			me = false;
			
			x += 1;
			
			thereIsWall(x, y += 1);
			thereIsMe(x, y);
				
			if (wall != true && me != true) {	
					route.addOneAfterRow(currentCoordinate);
					идём(x, y);

				go(x, y);
				
					стереть(x, y -= 1); 

			} else {

				wall = false;
				me = false;
				
				y -= 1;
				
				thereIsWall(x += 1, y);
				thereIsMe(x, y);
				
				if (wall != true && me != true) {					
						route.addOneAfterRow(currentCoordinate);
						идём(x, y);

					go(x, y);
					
						стереть(x -= 1, y);
					
				} else {

					wall = false;
					me = false;
					
					x -= 1;
					
					thereIsWall(x, y -= 1);
					thereIsMe(x, y);
					
					if (wall != true && me != true) {				
						route.addOneAfterRow(currentCoordinate);
						
						идём(x, y);
						
					go(x, y);
					
						стереть(x, y -= 1);

					} else {

						wall = false;
						me = false;
						
						System.out.printf("no way, looping back...\n"); // тут что делать, чтобы отойти до того места, где был ещё один wall !=true && me != true, но мы его пропустили из-за последовательности влево-вниз-вправо-вверх!?...
						
						return;
						
					}
				}
			}
		}
		
	}

Ответ на: комментарий от yoghurt

блин, вот как эта хрень называется! :)

спасибо.

Sonsee
() автор топика
Ответ на: комментарий от yoghurt

я-то думал там какая-то страшилка..! оказывается else'ы поубирал - вот и бэктрекинг.. лол

или я что-то напутал? ну, всмысле бэктрекинг - это, мол, выдумывай в голове сам как будешь следить за своим велосипедом, так? никакого ведь алгоритма по сути нет? просто за return'ами следишь и всё, не?

Sonsee
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.