양희 삼각형
- 수학에 대해 이야기하지 않으면 그 실현에 대해 이야기합시다.
- 도 아래 (1) 관찰 우리는 파스칼의 삼각형은 중간이 아닌, 알고 번호, 그 값은 그와 같은 어깨를 두 숫자의. 이 규칙을 사용하여 코드를 구성하고 중간 숫자를 쓸 수 있습니다.
- (2) 다음 양식을보십시오.
- 2 차원 배열을 사용하여 Yang Hui 삼각형을 나타내고이 그래프를 2 차원 배열에있는 요소의 첨자와 결합하여 관찰하고 위 규칙에 대한 코드를 성공적으로 찾을 수 있습니다. 어깨)!
- 그림의 법칙에 따라 쉽게 알아낼 수 있습니다. 예 : a [8] [3] = a [7] [2] + a [7] [3] , 루프를 작성하면 다음을 찾을 수 있습니다. 각 행의 숫자 값
- (3) 양측 숫자 1의 법칙에 관해서는 알기가 더 쉽습니다. 그들은 각각 첫 번째와 마지막입니다. 또 다른 예 : i 번째 행 에서 a [i] [0] = 1, a [i] [i] = 1 은 양쪽이 모두 1 ~임을 인식합니다.
C 언어 구현
- 위의 분석에 따르면 단계를 세분화합니다.
- (1) 우리는 그것이 실제로 정사각형이라는 것을 발견하고 아래쪽 삼각형 (그림에 표시된대로 직각 삼각형) 만 가지고 있으므로 먼저 n x n 2 차원 배열을 구성하고이를 사용하여 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;
}
그림에 표시된대로 : 결과 실행
- (2) 우리 는 이 1 의 규칙을 기억 하면서 양쪽에 1 을 인쇄합니다 . 줄의 시작과 끝에 나타납니다.
// 打印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;
}
결과 :
** (3) 세 번째 단계, 그것은 인쇄의 중간의 중요한 부분이다, 삼각형 위의 그 사진을 참조, 우리는 다음과 같은 번호를 알고, 그와 동일한 에 어깨에 두 개의 숫자 와 . 그런 다음이 규칙에 따라 달성 할 코드를 계속 작성할 수 있습니다!
세 번째 단계가 완료되면 모든 코드가 완료됩니다.
// 打印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;
}
결과를 인쇄하여 확인하십시오!
- 성공했지만 결과는 약간 지저분했고 터미널의 레이아웃이 좋지 않았습니다!
구현 방법은 많지만 분석과 고민 끝에 이런 방법을 썼으니 도움이 되길 바랍니다
Python 구현
방법 1 : 이전 C 언어 알고리즘을 기반으로 Python 구문으로 작성
- insert 메서드는 실제로 append () 메서드로 대체 할 수 있지만 효율성에 관계없이 insert를 사용하여 양쪽에 1을 삽입하여 C 언어 알고리즘의 단계를 반영하고 싶습니다.
# 纯基本语法
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)
Python 구현 (기능적 프로그래밍!)
방법 2 : sum () 및 zip 함수를 사용합니다.
- 이것은 인터넷에서 찾을 수있는 솔루션입니다. 정말 놀랍습니다.
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))
방법 3 :지도 방법
- 인터넷에서 찾은 것과 동일한 솔루션
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))