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.
- (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
- (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
- (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:
** (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!
- 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))