Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Type:Error

Seguindo o código da professora, ao tentar buscar um valor inexistente na minha lista o erro imprimido no meu console foi diferente.

Código da aula:

const listaLivros = require('./arrayOrdenado');

function busca(array, de, ate, valorBuscado) {
    console.log('de, ate', de, ate);
    const meio = Math.floor((de + ate) / 2);
    const atual = array[meio];

    if(valorBuscado === atual.preco) {
        return meio;
    }

    if(valorBuscado < atual.preco) {
        return busca(array, de, meio - 1, valorBuscado);
    }

    if(valorBuscado > atual.preco) {
        return busca(array, de + 1, ate, valorBuscado);
    }

}

console.log(busca(listaLivros, 0, listaLivros.length - 1, 60));

erro que aparece no console:

 if(valorBuscado === atual.preco) {
                              ^

TypeError: Cannot read properties of undefined (reading 'preco')
    at busca (C:\Users\Leonardo002\Desktop\Alura\Programação\JavaScript-Back-End\JavaScript II - Algoritmos de Ordenação e Busca\Aula4\busca.js:16:31)
    at busca (C:\Users\Leonardo002\Desktop\Alura\Programação\JavaScript-Back-End\JavaScript II - Algoritmos de Ordenação e Busca\Aula4\busca.js:25:16)
    at busca (C:\Users\Leonardo002\Desktop\Alura\Programação\JavaScript-Back-End\JavaScript II - Algoritmos de Ordenação e Busca\Aula4\busca.js:25:16)
    at busca (C:\Users\Leonardo002\Desktop\Alura\Programação\JavaScript-Back-End\JavaScript II - Algoritmos de Ordenação e Busca\Aula4\busca.js:25:16)
    at busca (C:\Users\Leonardo002\Desktop\Alura\Programação\JavaScript-Back-End\JavaScript II - Algoritmos de Ordenação e Busca\Aula4\busca.js:25:16)
    at busca (C:\Users\Leonardo002\Desktop\Alura\Programação\JavaScript-Back-End\JavaScript II - Algoritmos de Ordenação e Busca\Aula4\busca.js:25:16)
    at busca (C:\Users\Leonardo002\Desktop\Alura\Programação\JavaScript-Back-End\JavaScript II - Algoritmos de Ordenação e Busca\Aula4\busca.js:25:16)
    at busca (C:\Users\Leonardo002\Desktop\Alura\Programação\JavaScript-Back-End\JavaScript II - Algoritmos de Ordenação e Busca\Aula4\busca.js:25:16)
    at busca (C:\Users\Leonardo002\Desktop\Alura\Programação\JavaScript-Back-End\JavaScript II - Algoritmos de Ordenação e Busca\Aula4\busca.js:25:16)
    at busca (C:\Users\Leonardo002\Desktop\Alura\Programação\JavaScript-Back-End\JavaScript II - Algoritmos de Ordenação e Busca\Aula4\busca.js:25:16)

Quando eu coloco a condicional de parada com "if(de > ate)" retornando -1, o erro some e tudo funciona normalmente. A minha dúvida é, porque no exemplo da professora deu erro de estouro de pilha, mas no meu deu erro de tipo? Escrevi alguma coisa errada no código e não percebi?

2 respostas
solução!

Olá, Leonardo! Tudo bem?

Analisando o seu código encontrei a inconsistência que está gerando o seu erro, é na sua segunda condição, que verifica se o valorBuscado é maior do que atual.preco.

O erro está no retorno aplicado a essa condição onde você retorna a função busca com os parâmetros (array, de + 1, ate, valorBuscado). O parâmetro errado é o de + 1 que deveria ser meio + 1 já que o início dessa busca será no meio da nova lista.

O código corrigido ficará assim:

const listaLivros = require('./arrayOrdenado');

function busca(array, de, ate, valorBuscado) {
    console.log('de, ate', de, ate);
    const meio = Math.floor((de + ate) / 2);
    const atual = array[meio];

    if (valorBuscado === atual.preco) {
        return meio;
    };

    if (valorBuscado < atual.preco) {
        return busca(array, de, meio - 1, valorBuscado);
    }

    if (valorBuscado > atual.preco) {
        return busca(array, meio + 1, ate, valorBuscado);
    }
}

console.log(busca(listaLivros, 0, listaLivros.length - 1, 60));

Aplicando essa alteração, ao rodar o código, será retornado o mesmo erro que a da instrutora.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Boa noite, primeiramente perdão pela demora em responder. Muito obrigado, eu não tinha percebido esse detalhe, agora entendi o que houve e apliquei a correção. Mais uma vez, muito obrigado.