Comprensión de algoritmos recursivos y búsqueda binaria.

prefacio

Desde que me involucré en el campo del desarrollo web, rara vez he adquirido conocimientos relacionados con los algoritmos. Hoy, he hecho una exploración preliminar de los algoritmos básicos, incluida la recursividad, la búsqueda binaria, etc., y tengo algunas impresiones. Publico este blog para su referencia e intercambio mutuo!

1. Algoritmo recursivo

Ejemplo 1: encontrar recursivamente la sucesión de Fibonacci

const readline = require("readline"); 
const rl = readline.createInterface({ 
  entrada: proceso.stdin, 
  salida: proceso.stdout, 
}); 
/* 输入要求第几位 */ 
rl.on("línea", function (línea) { 
  let num = Número(línea); 
  const test = (a) => { 
    if (a === 1 || a = == 2) devuelve 1; 
    devuelve prueba (a - 1) + prueba (a - 2); 
  }; 
  console.log (prueba (num)); 
});

Pensamiento recursivo:

1. Encuentre una plantilla de solución general y llame a esta plantilla continuamente (llámese a sí mismo)

2. Esta plantilla no se resolverá en el proceso de llamada continua, pero a medida que los problemas que no se pueden resolver se sigan acumulando en la pila, siempre habrá un punto en el que se encontrará un valor preciso que pueda resolver el problema, y luego se publicará rápidamente cualquier problema no resuelto

punto importante:

1. La idea de la recursividad es muy abstracta. Básicamente, es imposible ver el resultado final del cálculo mirando el código. Se requiere un pensamiento abstracto.

2. Siempre que se escriba una plantilla común, la siguiente llamada recursiva se realizará espontáneamente y, finalmente, se obtendrá un resultado razonable, que se puede decir que "no hay salida después de que las montañas son pesadas y el río está lleno de dudas, y hay otro pueblo con sauces oscuros y flores".

3. Solo las plantillas se escriben en el método recursivo, y esta plantilla directamente "puede" generar el resultado en un sentido macro, pero es solo una "puede" abstracta.

Por ejemplo, el factorial de n se puede descomponer en el factorial de n + n - 1. ¡Este tipo de idea general de división es necesaria!

Para otro ejemplo, cada elemento de la secuencia de Fibonacci es la suma de los dos primeros elementos, luego nuestra plantilla recursiva es la suma de los dos primeros elementos

4. Debe haber if(){return} en el algoritmo recursivo, que no solo es el punto de avance encontrado por nuestro programa, sino también una operación necesaria para garantizar que la pila no se desborde.

5. Para simular una escena recursiva, primero tome una pequeña cantidad de contenido (números pequeños), analice el proceso de la escena y encuentre la plantilla

6. Al mirar el proceso recursivo, debe mirar el conjunto de datos del problema -1 cada vez que recurra, para que el problema se elimine capa por capa.

Ejemplo 2: Problema de la Torre de Hanoi

El problema de la Torre de Hanoi en realidad contiene dos pasos de recurrencia, ¡lo cual es un poco más complicado!

/* Problema de la Torre de Hanoi: La Torre de Hanoi es un problema recursivo clásico. Consta de tres pilares y unos discos de varios tamaños. 
Inicialmente, todos los discos se apilan en el primer pilar y se ordenan de mayor a menor. 
El objetivo es mover todos los discos al tercer pilar y mantener el orden original. Solo se puede mover un disco por movimiento y el disco grande no se puede colocar encima del disco pequeño. 
 */ 
const readline = require("readline"); 
const rl = readline.createInterface({ 
  input: process.stdin, 
  output: process.stdout, 
}); 
/* número de placa de entrada*/ 
rl.on("line", function (línea) { 
  let num = Número(línea); 
  const han = (n, a, b, c) => { 
    if (n === 0) console.log(a + "===>" + c ); // Avance del programa 
    else { 
      // Los siguientes tres pasos pueden obtener el resultado que queremos en un sentido macro 
      han(n - 1, a, c, b); // Mueve el primero al segundo (en realidad repite esta plantilla ) 
    } 
  ; 
      console.log(a + "===>" + c); // poner la última placa del primero directamente en el tercero
      han(n - 1, b, a, c);//Mueve el segundo al tercero (en realidad repite la plantilla) 
  han(num, "A", "B", "C"); 
} );

Ideas para resolver problemas:

Imaginamos que solo hay dos placas, por lo que surge este proceso de plantilla: mueva todas menos la última placa (n-1) en la primera columna a la segunda columna, y mueva la última placa (1 piezas) a la tercera columna, mover todas las placas (n-1) de la segunda columna a la tercera columna

2. Método de búsqueda binaria

El video correspondiente de la estación b: ¿ Por qué la búsqueda binaria siempre se escribe mal? _哔哩哔哩_bilibili

Ejemplo: generar el primer índice de un número igual a 5 en una matriz

let arr = [1, 2, 5, 5, 7]; 
const test = (matriz) => { 
  // console.log(matriz); 
  let l = -1; 
  let r = matriz.longitud; 
  while (l + 1 !== r) { 
    let num = parseInt(l + r); 
    if (matriz[num] < 5) { 
      l = num; 
    } else { 
      r = num; 
    } 
  } 
  if (matriz[r] === 5 ) { //Juicio especial, juzgue si realmente es 5 
    return r; 
  } else { 
    return -1; //5 no existe 
  } 
}; 
console.log(test(arr));

La plantilla para la búsqueda binaria se usa arriba: (pseudocódigo)

l = -1, r = N 
while l + 1 != N 
    m = l + r / 2 (向下取整) 
    if isBlue(m) 
        l = m 
    else 
        r = m 
return l o r

La idea de la búsqueda binaria:

1. Encuentra la condición de isBlue, es decir, el punto crítico (la línea divisoria entre rojo y azul)

2. Salida l o r, es decir, el lado izquierdo o derecho de la línea divisoria

Estrategia:

El primer valor en el extremo derecho del azul debe cumplir la condición de isBlue (la condición generalmente es solo menos que el signo), puede simular algunos números en el borrador para simular las condiciones de límite rojo y azul, para determinar si salida l o r

Por ejemplo: genere el índice del primer 5 coincidente en la matriz, luego la condición puede ser <5, luego tome r

Emita el índice de los últimos 5 coincidentes en la matriz, luego puede tomar <= 5, luego tomar l

3. Pensando en la recursividad y la dicotomía

Tanto la recursividad como la dicotomía involucran la idea de partes grises (problemas que no se pueden resolver)

1. La recursividad es expandir primero la parte gris, apilar los problemas, encontrar el punto para resolver el problema y luego reducir gradualmente la parte gris

2. Dos puntos son mitad y mitad, reduciendo gradualmente la parte gris hasta que se resuelve el problema

Supongo que te gusta

Origin blog.csdn.net/m0_58768224/article/details/129721915
Recomendado
Clasificación