private void procurarProximaRota(List<Rota> rotaDeEntrada, String origem, String destino, List<Rota> rotas) {
		// Valida se a origem jah passou por alguma rota, entao deve ser
		// disconsiderado, para nao gear looping infinito de rotas
		if (jaPassouPeloPontoComoOrigem(origem, rotaDeEntrada)) {
			return;
		}

		// Cria uma copia do ponto atual da lista de Rotas, pois se surger mais
		// de uma rota, deve-se usar a lista como entrou
		List<Rota> rotaEncontradaCopia = new ArrayList<Rota>(rotaDeEntrada);

		// flag que controla se foi encontrada alguma rota para este looping.
		// Isto eh necessario pois se encontrar mais de uma rota para o Loop,
		// entao deve se gerar uma nova lista de rotas
		boolean encontradaRotaNesteLoop = false;

		for (Rota rota : rotas) {

			// Valida origem e destino com a rota
			if (saoIguais(rota.getOrigem(), origem) && saoIguais(rota.getDestino(), destino)) {

				List<Rota> novaRota = criarNovaRota(encontradaRotaNesteLoop, rotaDeEntrada, rotaEncontradaCopia);

				novaRota.add(rota);

				encontradaRotaNesteLoop = true;

				// Valida a origem com a origem da rota
			} else if (saoIguais(rota.getOrigem(), origem)) {
				List<Rota> novaRota = criarNovaRota(encontradaRotaNesteLoop, rotaDeEntrada, rotaEncontradaCopia);

				novaRota.add(rota);

				encontradaRotaNesteLoop = true;

				// Segue para a proxima rota, pois o destino nao foi encontrado
				// ainda
				procurarProximaRota(novaRota, rota.getDestino(), destino, rotas);
			}

			// Necessario criar uma nova lista para cada origem igual encontrada
			// no loop inicial
			if (!rotaDeEntrada.isEmpty() && saoIguais(pesquisaRotaDTO.getOrigem(), origem)) {
				rotaDeEntrada = new ArrayList<Rota>();
				rotasEncontradas.add(rotaDeEntrada);
			}
		}
	}