楊輝の三角形を非常に詳細に説明してください!C言語とPythonの実装

楊慧三角

  • 数学について話さないのなら、その実現について話しましょう。
  • (1)私たちが知っているFIGの下での観察、パスカルの三角形、中間体は数ではなくその値は2つの数の等しいこのルールを使用して、コードを作成し、真ん中の数字を書くことができます。
    ここに画像の説明を挿入
  • (2)次のフォームを見てください。
  • 2次元配列を使用して楊輝の三角形を表し、このグラフを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行n列の2次元配列を作成し、それを使用して楊輝の三角形を格納します。 。
// 打印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)3番目のステップは、印刷の途中の重要な部分です。上の三角形の写真を参照してください。次の数字がわかります。これは 2つの数字との肩に相当します。次に、このルールに従って、達成するためのコードを書き続けることができます!

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つの方法は、2次元配列の概念を使用していないため、よりオープンマインドで、粘着性がありません!基本的に、それは肩に2つの数字を追加することです。でも、置き忘れなどを使って、肩の2つの数字の和を作り、同時に両側の1の問題を解決するのは、本当にすごいです〜思考の発散

おすすめ

転載: blog.csdn.net/pythonstrat/article/details/112785574