Yang Hui 삼각형을 매우 자세하게 설명하십시오! C 언어 및 Python 구현

양희 삼각형

  • 수학에 대해 이야기하지 않으면 그 실현에 대해 이야기합시다.
  • 도 아래 (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))

후자의 두 가지 방법은 2 차원 배열의 아이디어를 사용하지 않으므로 더 개방적이고 끈적임이 없습니다! 본질적으로 어깨에 두 개의 숫자를 더한 것입니다. 근데 오 배치 등을 이용해서 어깨에있는 두 숫자의 합을 구하고 동시에 양쪽에서 1의 문제를 푸는 건 정말 대단해요 ~ 사고의 발산

추천

출처blog.csdn.net/pythonstrat/article/details/112785574