tanrax / soy-un-buen-programador-js

Juego con retos sencillos de JavaScript para probarte a ti mismo que sabes lo que haces
11 stars 2 forks source link

Respuesta 6 #24

Open ghost opened 2 years ago

ghost commented 2 years ago

¡Hola @tanrax!

¿Cómo te va? ¡Gracias por el reto interesante!

He buscado información sobre la sucesión de Fibonacci. Hay información que quiero compartir: "La proporción áurea (la sucesión de Fibonacci) es un número irracional que descubrieron pensadores de la Antigüedad, no como una expresión aritmética, sino como proporción entre dos segmentos de una recta. Esa proporción puede hallarse tanto en figuras geométricas como en la naturaleza - la anatomía de los humanos, hojas, flores, galaxias, algunos tipos de caracol y otras cosas." Сreo que es educativo.

Ahora escribo un poco sobre la historia de mi function. Tengo dos versiones del function:

Function 1.

function fibonacciSequenceInArray(lengthOfArray) {
    digit1 = 0,  digit2 = 1;
    const fibonacciNumbersArray = [...Array(lengthOfArray+1).keys()];
    const storeFibonacciValues = fibonacciNumbersArray.filter(function(item, index, arr){
            return item
        }).map(function (item, index, arr) {
            if (index == 0) {
                return 0;
            } else {
                nextDigit = digit1 + digit2;
                digit1 = digit2;
                digit2 = nextDigit;
                return digit1;
            }
        });
    return storeFibonacciValues;
}

console.info(fibonacciSequenceInArray(10));

Function 2. Eliminó el filter y la inicialización de un array. Uso lengthOfArray dentro [...Array(lengthOfArray).keys()] pero no lengthOfArray+1. La versión final:

function fibonacciSequenceInArray(lengthOfArray) {
    digit1 = 0,  digit2 = 1;
    const storeFibonacciValues = [...Array(lengthOfArray).keys()]
    .map(function (item, index, arr) {
            if (index == 0) {
                return 0;
            } else {
                nextDigit = digit1 + digit2;
                digit1 = digit2;
                digit2 = nextDigit;
                return digit1;
            }
        });
    return storeFibonacciValues;
}

console.info(fibonacciSequenceInArray(10));

Me gustaría que pudieras compartir sus observaciones sobre esta cuestión.

¡Que tengas un buen día!

P.D.: Disculpas por mi español.

tanrax commented 2 years ago

Me gusta ver la evolución. Te he corregido la primera versión. (luego he visto que has quitado el filter).

/**
 * Description
 * params
 * return
 */
function fibonacciSequenceInArray(lengthOfArray) {
    const digit1 = 0; // Define constantes.
    // const firstDigitFibonacci = 0; Podríamos usar variables más semáticas o autoexplicativas
    const digit2 = 1; 
    const fibonacciNumbersArray = [...Array(lengthOfArray+1).keys()]; // No es verdad, no son los numeros de fibonacci, sino indices
    const storeFibonacciValues = fibonacciNumbersArray.filter(function(item, index, arr){ // Puedes borrar el filter, no hace nada
            return item
        }).map(function (item, index, arr) {
            if (index == 0) {
                return 0;
            } else {
                nextDigit = digit1 + digit2; // const
                digit1 = digit2; // const
                digit2 = nextDigit; // const

                return digit1;
            }
        });
    return storeFibonacciValues; // ok
}

console.info(fibonacciSequenceInArray(10)); // Good!
tanrax commented 2 years ago

Gracias por la dulce introducción a la secuencia de Fibonacci!

ghost commented 2 years ago

No encuentro nada dulce en el introducción a la secuencia de Fibonacci - la información es interesante, ¿amable? Pero, esta es tu visión y mi traducción. Suelo usar 'dulce' con mi queridos pero no con mis colegas en trabajo. Porque tuve la impresión (posiblemente falsa) de que nos estamos acercando. Tal vez sea porque no eres sincero, pero eres сortés a tu manera. Puede ser que esté equivocado. Esto es sólo una suposición, y un importante aspecto psicológico basado en los hábitos de comunicación con los seres queridos y otras personas.

Perdón por mi elocuencia - surgió la idea que quería compartir.

Agradezco el comentario. Por desgracia el codigo tiene el error con const. Ver por ti mismo por favor:

image

const fibonacciNumbersArray = [...Array(lengthOfArray+1).keys()]; 
// No es verdad, no son los numeros de fibonacci, sino indices
// respuesta: gracias por notarlo - el variable debe tener un nombre diferente

Lo siento por mis disparates con vars - estudié el JS un poco hace ~2 años. Ahora estudio el JS a mí mismo no profesional. Vi tu canal y tu cuestionario "soy-un-buen-programador-js" y decidí participar en el diálogo. Creo que conversación es interesante y importante en la educación. Me gustas. Me parece que eres una persona simpática, responsable, talentosa, desarrollador experimentado. Me parecio que no te interesa mucho, porque no revisaste el codigo que enviaste. No eres perfecto y mi tampoco, como todas las personas cometen errores. Esto esta bien. Yo lo entiendo. También entiendo que a veces necesitas hacer decisiones difíciles.

Decidí crear otra función que no inicialice los parámetros adicionales:

function fibonacciSequenceInArray(lengthOfArray) {
    const fibonacciArray = [...Array(lengthOfArray).keys()];
    const storeFibonacciValues = fibonacciArray
    .filter(function(item, index, arr){
        if (index === 0) return 0;
        if (index === 1) return 1;
        if (index > 1) return fibonacciArray
            .splice(index, 1, fibonacciArray[index-2] + fibonacciArray[index-1]);
    });
    return fibonacciArray;
}

console.info(fibonacciSequenceInArray(10));

Este es otro caso que creo es interesante. Hice la investigación pequeña con la hora y repetí varias veces. Parece que hay un diferencia entre el map y el filter && splice aqui. map es más rapido:

map_fib

splice_fib

Aquí están las fuentes:

console.time('version con splice');

function fibonacciSequenceInArray(lengthOfArray) {
    const fibonacciArray = [...Array(lengthOfArray).keys()];
    fibonacciArray
    .filter(function(item, index, arr){
        if (index === 0) return 0;
        if (index === 1) return 1;
        if (index > 1) return fibonacciArray
            .splice(index, 1, fibonacciArray[index-2] + fibonacciArray[index-1]);
    });
    return fibonacciArray;
}

console.info(fibonacciSequenceInArray(1000000));
console.timeLog('version con splice');
console.time('version con map');
function fibonacciSequenceInArray(lengthOfArray) {
   firstDigitFibonacci = 0,  secondDigitFibonacci = 1;
   const storeFibonacciValues = [...Array(lengthOfArray).keys()]
   .map(function (item, index, arr) {
           if (index == 0) {
               return 0;
           } else {
               nextDigit = firstDigitFibonacci + secondDigitFibonacci;
               firstDigitFibonacci = secondDigitFibonacci;
               firstDigitFibonacci = nextDigit;
               return firstDigitFibonacci;
           }
       });
   return storeFibonacciValues;
}

console.info(fibonacciSequenceInArray(1000000));
console.timeLog('version con map');

Atentamente.

ghost commented 2 years ago

Espero ver tus ideas en el canal de youtube. Me parece que es una buena idea y ¡me gustan tus videos! Además, ¿La sucesión de Fibonacci tiene la historia interesante? ¡Qué te mejores votos!

ghost commented 2 years ago

Andros, I'm very sorry if my actions or words hurt you or made you feel uncomfortable. I want to be transparent with you - I have mutual feeling. Hope that you could understand and forgive. I wish you have a lot of friends that could make you feel happy. Thank you for your time, videos, projects (including the current one) and cources that you created for people. Thanks for a possibility to translate one of them. All the best for you!