1
resposta

Declaração falsa

Não entendi porque a variável "achou" deve ser declarada como falsa. Resolvi inverter e colocar true onde é falso e vice-versa e o código não funcionou corretamente. Gostaria de entender o motivo.

1 resposta

Olá Renan, tudo bem? Vamos entender o que está acontecendo. Repare que queremos inserir números na nossa variável segredos que por enquanto é uma array sem nenhum elemento. Inicialmente o achou está como false. Vamos para o for. Vamos comparar segredos[posicao]==numeroAleatorio ou seja, estamos comparado o 1º elemento de segredos (que é nulo) com o númeroAleatorio que foi gerado. Isso resulta em que? false. Continuando a execução do código vamos para o próximo if(achou == false). A variável achou ainda é false, nesse caso false == false resulta em que? true. Então a condição vai ser atendida, excutando segredos.push(numeroAleatorio) e inserindo o primeiro elemento na nossa array.

Repare agora que já temos um elemento na array, e caso esse elemento seja igual ao numeroAleatorio a condição do primeiro if será atendida, fazendo achou ser true e impedindo a execução do segundo if. Conseguimos então que esse número repetido não entre na array.

O achou = false voce pode pensar como um gatilho para que eu tenha o meu primeiro elemento inserido na array (garantindo a execução do 2º if). Se voce colocar o achou = true, o primeiro if não vai ser executado(pq não ha nehnum elemento na array), partindo para o segundo if que não vai ser executado pq o achou é true e aí fica preso nesse looping.

Vc até pode colocar o achou=true desde que você também inverta o achou dos dois if's. Funciona do mesmo jeito. No entanto, semanticamente faz mais sentido o 1º if ter o achou = true.

Espero que tenha ficado claro. Qualquer coisa é só perguntar.

Um abraço.

function sorteiaNumeros(quantidade) {

        var segredos = [];
        var numero = 1;

        while(numero <= quantidade) {

            var numeroAleatorio = sorteia();

            if(numeroAleatorio !== 0 ) {

                var achou = false;

                for(var posicao = 0; posicao < segredos.length; posicao++) {
                    if(segredos[posicao] == numeroAleatorio) {
                        achou = true;
                        break;
                    }
                }

                if(achou == false) {
                    segredos.push(numeroAleatorio);    
                    numero++;
                } 
            }
        }

        return segredos;
    }