Necesito eliminar un carácter a la vez de una cadena, sin usar métodos nativos o bucles. He encontrado innumerables formas de hacer esto sin métodos nativos O sin bucles, pero parece que no puedo encontrar una manera de hacerlo sin ninguno de los dos. Pude encontrar una forma de usar la recursividad para evitar bucles, pero no estoy seguro de cómo no usar el método string.slice(). Debo usar la recursividad. No, esto no es un problema de tarea, solo estoy practicando para una entrevista.
Se supone que la función cuenta cuántas veces se repite el carácter de destino (si es que se repite) en una cadena de entrada.
const countChar = (input, target) => { if (input === '') return 0; if (input[0] === target) return 1 + countChar(input.slice(1), target); return countChar(input.slice(1), target); } console.log(countChar('hello world', 'o')); // 2 console.log(countChar('javascript', 'j')); // 1Lo principal para lo que su código actual está usando .slice() es para "recortar" su cadena para que en la próxima llamada recursiva, el primer carácter de su input sea el siguiente carácter que necesita verificar. En su lugar, puede pasar el índice del carácter actual que desea verificar, lo que le permite evitar la llamada de slice :
const countChar = (input, target, i = 0) => { if (i >= input.length) return 0; if (input[i] === target) return 1 + countChar(input, target, i+1); return countChar(input, target, i+1); } console.log(countChar('hello world', 'o')); // 2 console.log(countChar('javascript', 'j')); // 1 Por supuesto, existen otros métodos además de .slice() que podría usar para dividir su cadena, pero estos aún implican "bucle"/iterar su cadena debajo del capó. Un ejemplo es desestructurar:
const countChar = ([c, ...rest], target) => c ? (c === target) + countChar(rest, target) : 0; console.log(countChar('hello world', 'o')); // 2 console.log(countChar('javascript', 'j')); // 1 console.log(countChar('', 'j')); // 0 El fragmento anterior utiliza la asignación de desestructuración [c, ...rest] para extraer el primer carácter (almacenado en c ) del primer argumento pasado a su función. El ...rest toma todos los caracteres de la cadena pasada (excluyendo el primer carácter extraído) y los almacena en la variable rest .
¿El operador condicional ? : se usa para verificar si la variable c tiene un valor real (es decir, un carácter válido). c tendrá un valor falso ( undefined en nuestro caso) cuando countChar() se le pase una cadena vacía. Si c es veraz, entonces contiene un valor de carácter válido, por lo que el resultado de (c === target) + countChar(rest, target) se usa como el valor de retorno de la llamada a la función.
Aquí (c === target) se evaluará como true o false , que cuando se usa con + countChar(rest, target) convierte el valor booleano en un valor numérico, 1 si es true o 0 si es false . El : 0; significa que 0 se utiliza como valor de retorno cuando c es un valor falso (es decir, no quedan más caracteres para comprobar).