Recursión - Adición alternativa, el número de esquemas para recorrer la cuadrícula

Hola a todos, soy bang_bang, hoy registraré 2 preguntas típicas recursivas

Tabla de contenido

1. Adición alternativa

2. El número de esquemas en la grilla


1. Adición alternativa

Adición alternativa_nowcoder.com

Dados dos  enteros A y B. Escribe una función que devuelva el valor de A+B sin usar + u otros operadores aritméticos.

Muestra de prueba:

1,2

devoluciones: 3 

Ideas para resolver problemas: al calcular la suma decimal, agregaremos directamente dos números, y luego agregaremos el resultado de la suma al bit de acarreo, y finalmente obtendremos el resultado, pero no necesitamos ser tan engorrosos después del entrenamiento a largo plazo La respuesta se puede obtener por cálculo oral, pero la computadora no, necesita calcular recursivamente paso a paso de acuerdo con las reglas, y lo mismo ocurre con la suma binaria.

Suma de dos números:

1. El resultado de la suma directa (sin considerar el acarreo), la suma sin considerar el acarreo usa XOR ( lo mismo es 0, la diferencia es 1), y se ignora bien el acarreo; a^b.

2. Obtenga el resultado del acarreo (utilícelo como resultado de la suma y luego agréguelo -> recursividad), obtenga el acarreo y use la operación AND para desplazar un bit a la izquierda ; (a&b)<<1.

3. Sume recursivamente y calcule el acarreo hasta que uno de los cálculos sea 0 y el resultado final sea otro número.

Ejemplo:

        

el código se muestra a continuación:

class UnusualAdd {
public:
    int addAB(int A, int B) {
        if(A==0)    return B;
        if(B==0)    return A;   //任意一个为0,则说明另一个就是最终求和结果
        int a=A^B;//不考虑进位的相加结果
        int b=(A&B)<<1;//得到进位结果
        return addAB(a,b);
    }
};

2. El número de esquemas en la grilla

El número de esquemas en la red.

describir

Calcule la cantidad de n*m ​​cuadrículas de tablero de ajedrez (n es la cantidad de cuadrículas horizontales, m es la cantidad de cuadrículas verticales) comenzando desde la esquina superior izquierda del tablero de ajedrez y caminando a lo largo de la línea del borde desde la esquina superior izquierda hasta la inferior. esquina derecha. ¿Cuántos caminos hay en total? Retrocede, es decir: solo puedes ir hacia la derecha y hacia abajo, no hacia la izquierda y hacia arriba.

Nota: camine a lo largo de la línea de borde entre el tablero de ajedrez

Rango de datos: 1≤n,m≤8 

Introduzca una descripción:

Ingrese dos enteros positivos n y m, separados por espacios. (1≤n,m≤8)

Descripción de salida:

generar una fila de resultados

Ejemplo 1

Entrada: 2 2

Salida: 6

Ideas para resolver problemas:

Caminando a lo largo de la línea del borde, tal vez cuando n=m=2, haga un dibujo y podamos contar fácilmente cuántos caminos hay desde el punto inicial hasta el punto final, pero cuando n y m son muy grandes, es difícil para nosotros. para derivar en este momento, entonces para simplificar el problema, tenemos que tratar de usar el pensamiento recursivo:

1. Si una cuadrícula quiere ir de la esquina superior izquierda a la esquina inferior derecha, debe pasar por 2 puntos (la esquina superior derecha y la esquina inferior izquierda, es decir, los dos puntos adyacentes en la esquina inferior derecha)

2. Sabemos que debe haber una sola forma de caminar en línea recta, es decir, solo hay una forma de caminar en la frontera (el lado superior/más a la izquierda) .

3. Comenzamos desde el punto final y empujamos hacia atrás. El camino hacia el punto final es la suma de los caminos de los dos puntos adyacentes del punto final , y la suma de los caminos de los dos puntos adyacentes es la suma de sus posiciones en la esquina inferior derecha.La suma de las trayectorias de dos puntos adyacentes se devuelve de forma recursiva hasta que el problema se convierte en la suma de las trayectorias de múltiples puntos límite .

Resumen: La ruta al nodo a buscar es la suma de las rutas de sus 2 nodos adyacentes. Al retroceder recursivamente, la ruta de los 2 nodos adyacentes es la suma de las rutas de sus 2 nodos adyacentes. Hasta que el problema se convierte en la suma de las rutas de múltiples puntos de límite (múltiple se refiere al número de puntos de límite que se han empujado hacia atrás desde el punto final en total).

Código:

#include <iostream>
using namespace std;

int PathNum(int n,int m)
{
    if(n==0||m==0)
    {
        return 1;
    }
    return PathNum(n-1,m)+PathNum(n,m-1);
}

int main() {
    int n,m;
    cin>>n>>m;
    cout<<PathNum(n,m)<<endl;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/bang___bang_/article/details/131859598
Recomendado
Clasificación