Como implementar um algoritmo complexo?

Quando eu vou ver algum algoritmo complexo (busca binária, ordenação por intercalação, etc) eu sempre entendo os mesmos como funciona, porém, nunca consigo implementa-lo em uma linguagem de programação.

Vish, ninguém respondeu! ;-;

Normalmente conseguimos fazer algo quando temos a real necessidade de fazer, uma coisa puxa a outra.

Eu uso pseudocódigo. Algoritmos recursivos costumam ser mais difícil de implementar, então geralmente começo pela forma mais simples ou aquela que geralmente da mais trabalho.

Exemplo de busca binária recursiva:

meio = (fim - inicio) / 2 + inicio; // índice do meio
Se vetor[meio] < elemento {
    retorna buscar(vetor, inicio, meio, elemento);
} senão {
    retorna buscar(vetor, meio, fim, elemento);
}

as condições para finalizar são:

Se vetor[meio] == elemento {
    retorna meio;
}

Se meio == fim {
    retorna não encontrou;
}

então seria só juntar tudo:

buscar(vetor, inicio, fim, elemento) {
    meio = (fim - inicio) / 2 + inicio; // índice do meio
    Se vetor[meio] == elemento {
        retorna meio;
    }

    Se meio == fim {
        retorna não encontrou;
    }

    Se vetor[meio] < elemento {
        retorna buscar(vetor, inicio, meio, elemento);
    } senão {
        retorna buscar(vetor, meio, fim, elemento);
    }
}

outro exemplo, contar dias:

// hoje + o próximo dia
retorna 1 + contarDias(inicio + 1, fim);

as condições para finalizar são:

Se inicio == fim {
    retorna 1;
}

Se inicio > fim {
    exceção;
}

então:

contarDias(inicio, fim) {
    Se inicio == fim {
        retorna 1;
    }

    Se inicio > fim {
        exceção;
    }

    retorna 1 + contarDias(inicio + 1, fim);
}

mas ainda tem o problema inicio + 1 (próximo dia) em que inicio e fim seria uma classe Data assim:

class Data {
    int dia, mes, ano;
}

então

proximoDia(data) {
    data.dia += 1;
    Se data.dia >= 30 {
        data.dia = 1;
        data.mes += 1;
    }
    Se data.mes > 12 {
        data.mes = 1;
        data.ano += 1;
    }
   retorna data;
}

nem todos os meses tem 30 dias, então ainda seria necessário criar um método que retorna a qtd de dias no mês.

1 curtida

A pergunta pode nos levar a milhares de caminho, mas, entender como funciona e até fácil, o complicado e fazer isso na linguagem, talvez !!!

Treinar lógica, em programação é igual um jogador de futebol que treina chutes, para ficar bom tem que sempre treinar, então, TREINE, TREINE …

Eu treino até hoje! kkk

1 curtida