Sé que hay algún problema con la declaración de devolución, pero no puedo averiguar qué.
let arr = ['a', 'b', 'c', 'a'] let size = arr.length - 1 let counter = 0 function findOcc(arr, size, x) { if (size === 0) { return counter } else { if (arr[size] === x) return counter++ findOcc(arr, size - 1, 'a') } } console.log(findOcc(arr, size, "a"))Una versión recursiva más simple utiliza la desestructuración de la matriz para comparar el primer valor con el valor de destino, agregando uno si coincide y cero si no lo hace, y luego se repite en el resto de la matriz. Nos detenemos cuando el valor no está definido, lo que significa que nos hemos quedado sin elementos en la matriz.
const countOcc = (target) => ([x, ...xs]) => x == undefined ? 0 : (x == target ? 1 : 0) + countOcc (target) (xs) const arr = ['a', 'b', 'c', 'a'] console .log (countOcc ('a') (arr)) console .log (countOcc ('b') (arr)) console .log (countOcc ('c') (arr)) console .log (countOcc ('d') (arr))Si bien podríamos modificar esto para que sea recursivo en la cola, los motores JS actuales aún no optimizan las llamadas en la cola, por lo que parece un poco inútil. Si fuera a hacer esto en arreglos grandes, probablemente necesitaría reescribir con iteración en lugar de recursividad.
Parece que entendiste la lógica en tu cabeza, pero no la implementaste bien.
Entonces, para la condición base, dice if (size===0) devuelve el contador. Esto significa que solo devuelve el contador, pero arr[0] es una verificación válida. Entonces, lo que realmente quiere cuando está verificando elementos es arr[size-1] en la siguiente línea, es decir, más
Para la condición else, tenía la intención de incrementar el contador, lo cual es correcto, pero no debe regresar. En su lugar, devuelve el valor de la próxima llamada con tamaño-1
También su declaración de tamaño debe ser let size = arr.length
Además, el último argumento debe ser x y no a dentro de la llamada recursiva.
Con eso el código es:
let arr = ['a', 'b', 'c', 'a'] let size = arr.length let counter = 0 function findOcc(arr,size,x) { if (size === 0) return counter if(arr[size-1]===x) ++counter return findOcc(arr,size-1,x) } console.log(findOcc(arr, size, "a"))Si uno está de acuerdo con mutar la matriz original, entonces la función se puede simplificar como se muestra a continuación:
const origArr = ['a', 'b', 'c', 'a']; // a simpler implementation of the same recursive function function findOcc(arr, x) { return ( arr.length // if "arr" length is 1 or more ? arr.pop() === x // ".pop()" the last elt & compare with "x" ? 1 + findOcc(arr, x) // add 1 & recurse using the shorted/mutated "arr" : findOcc(arr, x) // do not add 1, but recurse using the mutate "arr" : 0 // no more elements in "arr", so return 0 ) } // using "..." spread to avoid "arr" from being changed console.log('number of times "a" occurs is: ', findOcc([...origArr], "a")) console.log( `"d" occurs in ["${origArr.join('", "')}"] ${findOcc([...origArr], "d")} times...` )