Problemas na recursão (função pixelsImagem)

Problemas na recursão (função pixelsImagem)

por João Henrique Luciano -
Número de respostas: 3

   Pessoal, poderiam me ajudar na lógica da função pixelsRegiao?

  A base eu já escrevi tranquilamente, mas estou me enrolando totalmente na hora de passar os parâmetros para as chamadas recursivas (em especial o parâmetro CelPixel **pIni).
   Em cada chamada, caso a cor do pixel (h,w) seja igual ao da semente, eu crio uma célula nova (no meu caso chamo-a de "nova", dou malloc etc). Minha ideia foi, nas proximas chamadas, passar em (**pIni) o valor de &(nova->prox), mas na segunda chamada (no total são de 8 a 3, mesmo possível número de vizinhos), esse valor seria modificado e eu perderia a lista da primeira chamada. Tô quebrando a cabeça com isso faz 2 dias perplexo

(Editado por José Coelho de Pina - Saturday, 7 September 2013, 14:31)

João, acrescentei "(função pixelsImagem)" ao título do tópico.

Em resposta à João Henrique Luciano

Re: Problemas na recursão

por Lucas Silva -

esse valor seria modificado e eu perderia a lista da primeira chamada


Não sei como você faria dessa forma para evitar perder a lista da primeira chamada, mas o que você pode fazer é tentar passar sempre o começo da lista de pixels assim como você faz na primeira vez que você chama a função, dessa forma, você não perderia a sua lista em outras chamadas.

 

Em resposta à João Henrique Luciano

Re: Problemas na recursão

por José Coelho de Pina -

mas estou me enrolando totalmente na hora de passar os parâmetros para as chamadas recursivas (em especial o parâmetro CelPixel **pIni).

Veja as anotações da aula 09.
Em particular, veja a função que insere um elemento no início de uma lista.
Fizemos duas versões erradas dessa função e duas certas.
O modelo que cai como uma luva par o EP é a função de protótipo:

   void insere (int x, Celula **ini);

Essa função insere uma célula no início de ua lista ligada (o modelo de inserção mais simples).
Em português, ini é um ponteiro para um ponteiro (início!) de uma lista de células.
No caso do EP:

  • em vez de um inteiro x temos um pixel;
  • em vez de um ponteiro para o ponteiro que armazena o início de uma lista de inteiros temos um ponteito para um ponteiro que armazena o início de uma lista de pixels (CelPixel).

Apesar de mais envolvente, esse função que você esta fazendo segue basicamente os mesmos passos da insere; tirando a parte de recursão:

/* 0. base da recursao */
if (base) ...

/* 1. aloca uma nova celula */
[. . .]

/* 2. coloca as informações na estrutura da nova célula */
[. . .]

/* 3. insere a célula no início da lista apontada por pIni */
[. . .]

/* 4. chamadas recursivas */
[. . .]

/* 5. retorna número de células da lista pIni */
[. . .]

Bem, agora veja se esta sugestão e a do Lucas ajudam a andar um pouco mais.