pensando de forma recursiva

Este plato de pollo problema finalmente comenzó a aprender el algoritmo, encontrado recientemente recursivo sensación difícil de entender, aquí para escribir algunos de los errores para preguntas relacionadas al resumen



** El recursivo general pensamiento: **
1. Localizar las condiciones de parada de recursividad
2. Encuentre el enlace entre cada capa de recursividad


 

> Pregunta 1 : ** ** multicapa ciclo simplificado
> encuentre un número natural 1, 2, ......, m tomar cualquier número de todas las combinaciones de k. .. Ej 5 = m, K = 3
> Case: cuando la entrada 53
> 53
. 5. 4. 3
5 2. 4.
5. 4. 1.
5 3 2
5 3. 1
5. 1 2.
4. 3 2.
4. 3. 1.
4. 1 2.
3. 1 2.


 

Análisis:
Si este problema es la enumeración violencia, entonces, es el uso de múltiples bucles, cada una de las columnas corresponde a un ciclo, pero la complejidad de la gran ------> simplificado: De hecho, el ciclo de cada capa son un tratamiento similar ** ** método de la circulación, hay un cierto enlace ** ** entre cada capa.
En este problema:
Detener la recursión de que: cuando el k-ésimo dígitos ha encontrado tiempo (este paso se puede llevar a cabo la grabación de contador)
la relación entre cada capa:  el primer número se determina cuando se determina el número de este último se convierte en una combinación del número m-1 para encontrar el número de la k-1 donde -----------------> esto se refleja en la reducción del tamaño problema recursivo

Salida para cada capa: * Cuando el contador cuenta el tiempo k, con el tiempo de salida, que necesitan datos de salida: capas de retención antes de los datos anteriores, es difícil de transferir en un proceso recursivo, ------ "puede ser adicionalmente define una matriz de papel hacer memoria


 

#include <la iostream> 
typedef Long Long LL; 
el uso de espacio de nombres STD; 
n- int, K, ANS [100]; // el primer dígito almacenado cur 
void Imprimir ()  { 
 for (int i = 1;. I <= K; ++ I )  tribunal << ANS [I] << '' ; tribunal << endl;} void DFS (X, int CUR) / * RA representa el rango 1-> x, cur que es los primeros números * / int { I; IF (== k + cur 1). en el cur // actualizado a k cuando el número de ciclos y la correspondiente salida de impresión (); for (i = x; i> = 1; i--) / * per entrar en un bucle recursivo siempre un principio a la salida mínima * / {ANS [DIV] = I; DFS (1-I, + 1 CUR..); // cada vez que un número no se ha introducido para un ciclo debe durar al }}

 

 Aquí estoy en un algoritmo recursivo no puede averiguar el lugar de inicio

1. ¿Por qué entrada de la función recursiva en una de rizo interior ----

      En Siluliti estado, esto es realmente un ciclo de varios, cuando la necesidad de introducir una entrada recursivo, es decir no a la función de bucle más interno después del final del ciclo (la capa más interna, los resultados correspondientes se estará en todas partes! !), que lo puso en una función recursiva, lo que significa que          cada uno en una nueva función recursiva, entró en una nueva capa de la circulación (por lo que el final de ese ciclo hasta el primer tiempo el número de k)

2. Cuando el recursiva pasado al otro, lo que pasó?

  Dado que la función recursiva es en el bucle en el interior, en los medios de función recursiva que una función de esta capa i, este proceso recursivo se produce una vez ejecutados, (si las condiciones lo permiten este nivel que pudiera entrar cada recursiva i voluntad )

   Cuando se dirigió al final de la recursividad retrocederá un ciclo y el ciclo continúa


 

factorización 2. entero

Salida de un número entero positivo n son todos los números enteros y formas. El n = 4 

3
3 = 3
3 = 2 + 1
3 = 1 + 2
3 = 1 + 1 + 1


 

Análisis: Esta pregunta es una actualización sobre una cuestión de la relación entre las capas de pensamiento se refleja en su recursiva: Después de determinar el primer número i, ni problema que queda es la de romper (problema de reducción)

          Aquí Para detener las condiciones de recursividad: No hay nada que puede dividir, descansar == 0;


# include <la iostream> 
typedef Long Long LL; 
el uso de espacio de nombres de enfermedades de transmisión sexual; 
n int, REST, 'bits, tienda [100 ]; 
 sin efecto de impresión ()  {  int i = 0 ; n-tribunal << <<' = ' ; el tiempo (tienda [ ! I] = 0 ) {<< COUT tienda [I] ;! SI (tienda [I + 1] = 0. ) << COUT '+' ; I ++ ;} tribunal << endl;} // cada uno es una división bucle dfs void (int resto, poco int ) // desde su separación es un entero, cada entrada debe todo recursión con REST {int I; for (i = REST; I> = 1;. i-- ) tienda {[ 'bit] = I; // almacenar el bit si (resto-i == 0) // escribir la primera condición final, el valor de los cuales solo ciclo (para) resto no se actualiza, de modo que a través de la impresión (); DFS demás (resto-i, poco + 1); // valor de la actualización y el resto del bit, bit ++ escrita en forma de no sólo una copia de los valores de entrada ha cambiado } // return 0; } intmain () {ios :: sync_with_stdio (0), cin.tie (0 ); cin >> n; descansar = n; dfs (n, 0 ); return 0 ; }

Temas emergentes:

Este código está escrito super largo tiempo (T_T)

Pregunta 1: Uso del caso (resto == 0) poner fin a la idea errónea de condiciones: No hay nada que puede dividir, es decir, descansar == 0, mi función de salida usando un bucle while DFS, si no termina aquí, llamando después que el resto terminará 0

: Corrección de prestar atención a las condiciones de entrada para el ciclismo: Nota función recursiva condiciones de entrada y las condiciones de salida están en circulación desde hace años, descansar == 0, no puede entrar en el bucle, y más en una función recursiva puede conducir a desperdicio de espacio, un registro debemos examinar un descanso no puede ser dividido

Pregunta 2: Cuando las llamadas a funciones recursivas utilizando esta transferencia de bits ++ datos del formulario, después del final de una de las funciones más interior, salta a la ubicación de la segunda capa de la cuenta atrás matriz de almacenamiento va a haber problemas, se suponía que empezar de cero, pero la recursividad fue trasladado cuántas veces, la cantidad de pasos es indignante

Corrección: la función se pasa una copia de los datos, o el uso ++ ++ valores de bit Bit Bit se generan de manera que el cambio real en


 

Escalada! ! : La salida no se repite, por ejemplo después de 4 = 3 + 1 + 1 = 4 no podrá dar salida 3


 

Análisis: En el ciclo pasó a una nueva ronda, se determinó que las cifras son iguales o menos redondo


 

Código de reescritura:

dfs void (pre int, de descanso int , int bit) // desde su separación es un entero, cada entrada debe todo recursión con REST
 { 
    int I; 
    for (i = pre;. I> = 1; i--) / pasa / función del estado actual de los parámetros abajo     { 
        SI (resto-i <0) continúo ; // asegurarse resto-i no es inferior a 0, sólo el tiempo lo enormemente i <0, de modo que pueda continuar Guardar coutine pequeña, hasta que el valor apropiado de la  tienda [ 'bit] = I;  // IF (' bit> 0 && tienda [ 'bit]> tienda [' de bits 1.]) Continuar;  IF (I-REST == 0) // escribir la primera condición de fin único valor de la capa dentro del bucle (para) resto no se actualiza, de modo que exceso de impresión (); dfs demás (i , descansar-i, bit + 1); // valor de actualización y el resto del bit, el bit no está escrito en forma de ++ solamente una copia de los valores de entrada ha cambiado}

 

Supongo que te gusta

Origin www.cnblogs.com/wengst/p/12580920.html
Recomendado
Clasificación