Explique o triângulo Yang Hui em detalhes super! Linguagem C e implementação de Python

Triângulo Yanghui

  • Se não falamos sobre matemática, falemos sobre sua realização.
  • (1) Observação sob a FIG sabemos, o triângulo de Pascal, o intermediário não é um número, e seu valor, igual a seus ombros de dois números. Usando essa regra, podemos construir o código e escrever o número do meio.
    Insira a descrição da imagem aqui
  • (2) Observe o seguinte formulário:
  • Podemos usar uma matriz bidimensional para representar o triângulo Yang Hui e observar este gráfico, combinado com os subscritos dos elementos na matriz bidimensional, e encontrar com sucesso o código para a regra acima (a soma dos números em o ombro)!
  • É fácil descobrir de acordo com a lei na figura, por exemplo: a [8] [3] = a [7] [2] + a [7] [3] , e então escrever um loop, você pode encontrar o valor do número em cada linha
    Insira a descrição da imagem aqui
  • (3) Em relação à lei do número 1 em ambos os lados, é mais fácil descobrir. Eles são o primeiro e o último, respectivamente. Em seguida, outro exemplo: na i-ésima linha , a [i] [0] = 1, a [i] [i] = 1 percebe que ambos os lados são 1 ~

Implementação de linguagem C

  • De acordo com a análise acima, dividimos as etapas:
  • (1) Descobrimos que é na verdade um quadrado, e então tem apenas um triângulo inferior (triângulo retângulo como mostrado na figura), então primeiro construímos uma matriz bidimensional n por n e a usamos para armazenar o 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;
}

Conforme mostrado na figura: resultados em execução
Insira a descrição da imagem aqui

  • (2) Em seguida, imprimimos o 1 em ambos os lados , lembrando a regra deste 1 . Ele aparece no início e no final de uma linha
// 打印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;
}

O resultado:
Insira a descrição da imagem aqui
** (3) A terceira etapa, é uma parte crítica do meio da impressão, consulte o Triângulo acima dessa imagem, sabemos o seguinte número, igual a seus ombros em dois números e . Então, de acordo com esta regra, você pode continuar a escrever código para alcançar!

Após a conclusão da terceira etapa, todos os códigos são concluídos.

// 打印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;
}

Imprima os resultados para ver!
Insira a descrição da imagem aqui

  • Foi um sucesso, mas o resultado ficou um pouco bagunçado e o layout do terminal não ficou muito bom!

Existem muitos métodos de implementação, mas após minha análise e consideração, eu escrevi um deles, espero que seja útil para você

Implementação Python

Método 1: com base no algoritmo da linguagem C anterior, escreva-o na sintaxe Python

  • O método insert pode realmente ser substituído pelo método append (), mas eu quero refletir as etapas no algoritmo da linguagem C, inserindo o 1 em ambos os lados, usando insert, independentemente da eficiência.
# 纯基本语法
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) 

Implementação Python (programação funcional!)

Método 2: Use as funções sum () e zip.

  • Esta é uma solução encontrada na Internet. É realmente incrível.
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 do mapa

  • A mesma solução encontrada na 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))

Os dois últimos métodos não usam a ideia de matrizes bidimensionais, portanto, têm a mente mais aberta e não são pegajosos! Essencialmente, é a adição de dois números nos ombros. Mas usar o deslocamento, etc., para construir a soma dos dois números no ombro e para resolver o problema de 1 em ambos os lados ao mesmo tempo, é realmente incrível ~ Divergência de pensamento

Acho que você gosta

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