Todavía debe devolver la fila correcta en el caso de un número de entrada que no forma una pirámide completa.
Las entradas old, Internal, lr son todas internas y no debería ser necesario completarlas.
const pir = (Input, old, Internal, lr) => { console.log({ Input, Internal, lr }); if (Internal === undefined || lr === undefined || old === undefined) { Internal = 1; lr = 1; old = 1; } console.log({ Input, Internal, lr }); if ( ( Input === Internal ) || ( Input < Internal && old > Internal ) ) { return lr; } else { return pir(Input, Internal, Internal + (lr + 1), lr + 1) } };La condición old > internal nunca va a ser verdadera.
Debe obtener la condición en la que solo hay un exceso (no igualdad). Cuando hay un desbordamiento, devuelva lr - 1 , que es el valor anterior de lr , y que estaba bien:
if (Input < Internal) { return lr - 1; // Return previous value of lr (the last successful one) }Algunas otras observaciones:
old argumentoAsí es como podría verse la función:
const pir = (input, internal=1, lr=1) => { if (input < internal) { return lr - 1; // Return previous value of lr (the last successful one) } else { return pir(input, internal + lr + 1, lr + 1) } }; Finalmente, la relación entre el tamaño y el ancho de tal "pirámide" es matemática. Esta relación se puede resolver en términos del ancho, por lo que podemos escribir pir como:
const pir = input => Math.floor((Math.sqrt(1+8*input) -1)/2);