¡Explica el triángulo Yang Hui con superdetalle! Implementación de lenguaje C y Python

Triángulo de Yanghui

  • Si no hablamos de matemáticas, hablemos de su realización.
  • (1) Observación bajo FIG que sabemos, triángulo de Pascal, el intermedio no es un número, y su valor, igual a sus hombros de dos números. Usando esta regla, podemos construir el código y escribir el número del medio.
    Inserte la descripción de la imagen aquí
  • (2) Mire el siguiente formulario:
  • Podemos usar una matriz bidimensional para representar el triángulo Yang Hui y observar este gráfico, combinado con los subíndices de los elementos en la matriz bidimensional, y encontrar con éxito el código para la regla anterior (la suma de los números en el hombro)!
  • Es fácil de averiguar de acuerdo con la ley de la figura, por ejemplo: a [8] [3] = a [7] [2] + a [7] [3] , y luego escribe un bucle, puedes encontrar el valor del número en cada fila
    Inserte la descripción de la imagen aquí
  • (3) Con respecto a la ley del número 1 en ambos lados, es más fácil de averiguar. Son el primero y el último respectivamente. Luego otro ejemplo: en la i-ésima fila , a [i] [0] = 1, a [i] [i] = 1 se da cuenta de que ambos lados son 1 ~

Implementación del lenguaje C

  • Según el análisis anterior, desglosamos los pasos:
  • (1) Descubrimos que en realidad es un cuadrado, y luego solo tiene un triángulo inferior (triángulo rectángulo como se muestra en la figura), por lo que primero construimos una matriz bidimensional de n por n, y la usamos para almacenar el triángulo de Yang Hui .
// 打印100行杨辉三角
#include<stdio.h>
int main()
{
    
    
	int yang[50][50] = {
    
    0};
	int i, j, m;


	// 打印杨辉三角
	for(i=0; i<50; i++)
	{
    
    
		// 这里只打印二维数组的杨辉三角部分没所以 j <= i
		for(j=0; j<=i; j++)
		{
    
    
			m = yang[i][j];
			printf("%d", m);
		}	
		printf("\n");
	}
	return 0;
}

Como se muestra en la figura: resultados de ejecución
Inserte la descripción de la imagen aquí

  • (2) Luego imprimimos el 1 en ambos lados , recordando la regla de este 1 . Aparece al principio y al final de una línea.
// 打印100行杨辉三角
#include<stdio.h>
int main()
{
    
    
	int yang[25][25] = {
    
    0};
	int i, j, m;

	// 补充代码打印杨辉三角两边的 1
	// 输出每行的1,位置是行首和 行尾,对应的下标是 [][0] , [][i].  i为当前行,以0开始 
	for(i=0; i<25; i++)
	{
    
    
		
		yang[i][0] = 1;
		yang[i][i] = 1;
	}

	// 打印杨辉三角
	for(i=0; i<25; i++)
	{
    
    
		for(j=0; j<=i; j++)
		{
    
    
			m = yang[i][j];
			printf("%d", m);
		}	
		printf("\n");
	}
	return 0;
}

El resultado:
Inserte la descripción de la imagen aquí
** (3) El tercer paso, es una parte crítica de la mitad de la impresión, consulte el Triángulo de arriba de esa imagen, conocemos el siguiente número, igual a sus hombros en dos números y . Luego, de acuerdo con esta regla, ¡puede continuar escribiendo código para lograrlo!

Una vez finalizado el tercer paso, todos los códigos están terminados.

// 打印100行杨辉三角
#include<stdio.h>
int main()
{
    
    
	int yang[25][25] = {
    
    0};
	int i, j, m;

	// 输出每行的1,位置是行首和 行尾,对应的下标是 [][0] , [][i].  i为当前行,以0开始 
	for(i=0; i<25; i++)
	{
    
    
		yang[i][0] = 1;
		yang[i][i] = 1;

		// 补充代码,打印一行中间的数字
		for(j=1; j<i; j++)
		{
    
    
			// 注意 j的取值,从每行的第二个数字,到倒数第二个数字,因为第一个最后的数字是 1固定的
			// 按照数的值 是它肩上两个数的和
			yang[i][j] = yang[i-1][j-1] + yang[i-1][j];	
		}
		
	}

	// 打印杨辉三角
	for(i=0; i<25; i++)
	{
    
    
		for(j=0; j<=i; j++)
		{
    
    
			m = yang[i][j];
			printf("%d  ", m);  // 为了格式好看,我们在这里加上两个空格,隔开数字!!!
		}	
		printf("\n");
	}
	return 0;
}

¡Imprime los resultados para verlos!
Inserte la descripción de la imagen aquí

  • Tuvo éxito, pero el resultado fue un poco desordenado, ¡y el diseño en la terminal no fue muy bueno!

Hay muchos métodos de implementación, pero después de mi análisis y consideración, escribí uno de ellos, espero que les sea útil.

Implementación de Python

Método 1: basado en el algoritmo de lenguaje C anterior, escríbalo en sintaxis de Python

  • El método de inserción en realidad puede ser reemplazado por el método append (), pero quiero reflejar los pasos en el algoritmo del lenguaje C, insertando el 1 en ambos lados, usando insertar, independientemente de la eficiencia.
# 纯基本语法
yang = []
n = int(input("请输入你想打印的杨辉三角层数:"))
for i in range(0, n):
    temp = []
    temp.insert(0, 1)
    for j in range(1, i):
        num = yang[i-1][j-1] + yang[i-1][j]
        temp.append(num)
    # 因为 insert方法会在指定位置位置增加一个 值,若原本位置上有值,那么将被后移,造成第一行有两个1, 所以加个判断
    if i > 0:
        temp.insert(i, 1)
    yang.append(temp)

for k in yang:
    print(k) 

Implementación de Python (¡programación funcional!)

Método 2: use las funciones sum () y zip.

  • Esta es una solución que se encuentra en Internet. Es realmente sorprendente.
def generate(numRows):

        l1 = [1]
        l2 = []
        n = 0
        while n<numRows:
            l2.append(l1)
            # 这里的 本质算法还是一样的 ,在列表前后分别加上 [0], 再利用zip 和sum 函数进行计算。 既解决了
            # 两边都是1 的问题, 也造成原来的元素错位。sum 求和,就等于是两肩上的数求和!! 厉害!并且只运用一层循环。
            l1 = [sum(t) for t in zip([0]+l1, l1+[0])] 
            n += 1
        return l2

print(generate(8))

Método 3: método de mapa

  • La misma solución encontrada en Internet.
def generate(numRows):

        if numRows==0:
            return []
        l1 = [[1]]
        n = 1
        while n<numRows:
            # 利用 map 函数 和匿名函数实现,本质和 zip num 实现是一样的,也是错位   
            l1.append(list(map(lambda x,y:x+y, [0]+l1[-1], l1[-1]+[0])))
            n += 1
        return l1

print(generate(8))

Los dos últimos métodos no utilizan la idea de matrices bidimensionales, por lo que son más abiertos y libres de pegajosidad. Esencialmente, es la suma de dos números en los hombros. Pero usar la ubicación incorrecta, etc., para construir la suma de los dos números en el hombro y resolver el problema de 1 en ambos lados al mismo tiempo, es realmente asombroso ~ Divergencia de pensamiento

Supongo que te gusta

Origin blog.csdn.net/pythonstrat/article/details/112785574
Recomendado
Clasificación