【Python实现杨辉三角】

article/2025/8/28 3:30:54

目录

什么是杨辉三角

杨辉三角解法

1. 定义法

2. 计算杨辉三角 补0法

 3. 杨辉三角,对称法

 4. 杨辉三角,单列表方法

5.列表嵌套(二维数组)

6. 新旧两行,一次性开辟新行

7.yield函数

8.zip函数

参考资料链接:


一、什么是杨辉三角

杨辉三角,是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。

杨辉三角_百度百科

杨辉三角的性质:

每个数字等于上一行的左右两个数字之和。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和。

为了解决这个问题,并了解更多的解法,我在网上查找了一些资料,将解法进行了汇总

二、杨辉三角解法

1. 定义法

思路:

从第三行开始,每一行的首尾都是1,中间部分每个数字等于上一行的左右两个数字之和。先定义每一行的第一个数字,然后在利用规则对中间部分进行运算,最后再添加最后一个元素。

PS:这个解法还是比较容易想出来的

代码:

# 计算杨辉三角 定义法
n = eval(input("输入要打印的行数:"))
triangle = [[1], [1, 1]]
for i in range(2, n):  # 已经给出前两行,求剩余行pre = triangle[i-1]  # 上一行cul = [1]  # 定义每行第一个元素for j in range(i-1):  # 算几次cul.append(pre[j]+pre[j+1])  # 每个数字等于上一行的左右两个数字之和。cul.append(1)  # 添加每行最后一个元素triangle.append(cul)
print("普通输出:{}".format(triangle))
for i in range(n):  # 按等边三角形格式输出s = " "*(n-i-1)for j in triangle[i]:s = s + str(j)+" "print(s)

运行结果

定义法也可以使用下面这种形式,先给出一个空列表,通过循环先进行追加列表,在对列表进行修改

代码

n = eval(input())
triangle = []
for i in range(n):cur = [1]triangle.append(cur)    #先追加进去if i == 0:continuepre = triangle[i-1]for j in range(i-1):cur.append(pre[j] + pre[j+1])cur.append(1)
print(triangle)

2. 补0法

补零法是在定义法的基础上,通过对上一行加[0],那么每行只需定义每行的第一个元素,这一行的其余元素可以通过上一行的左右两个元素相加得到。值得注意的是补零只是对中间的过程变量进行补零,不影响输出结果。

代码

# 计算杨辉三角 补0法
triangle = [[1]]
n = eval(input("输入行数:"))
for i in range(1, n):swap = triangle[i-1]+[0]cul = [1]for j in range(len(swap)-1):cul.append(swap[j]+swap[j+1])triangle.append(cul)
print(triangle)

运行结果

 

3.对称法

思路

中点的确定:

代码:

# 杨辉三角,对称法
n = eval(input("输入要打印的行数:"))
triangle = [[1], [1, 1]]
for i in range(2, n):tmp = triangle[-1]#上一个列表cul = [1] * (i+1)for j in range(i//2): #有图知:大概的临界值为一半,再仔细推敲cul[j+1] = tmp[j]+tmp[j+1]if i != 2j:#当j不为中点时cul[-j-2] = cul[j+1]triangle.append(cul)
print(triangle)

运行结果

4. 杨辉三角,单列表方法

代码

# 杨辉三角,单列表解决
n = eval(input("输入要打印的行数:"))
row = [1] * n
for i in range(n):z = 1offset = n - ifor j in range(1, i//2+1):val = z + row[j]z = row[j]row[j] = valif i != 2*j:row[-j - offset] = valprint(row[:i+1])

运行结果

5.列表嵌套(二维数组)

概念:list1[n][m] = list1[n-1][m-1] + list1[n-1][m]

代码

n=int(input())
list1=[]
for n in range(n):row=[1] # 第一行第一列为1list1.append(row)if n==0:for num in row:  # 这里主要是为输出做的格式处理print(num,end=" ")print()continuefor m in range(1,n):row.append(list1[n-1][m-1]+list1[n-1][m])row.append(1)for num in row:print(num, end=" ")print()

这个方法利用List列表将二维数组进行实现

6. 新旧两行,一次性开辟新行

代码

m = eval(input("输入要输出的行数:"))
# 新旧两行,一次性开辟新行
ordline = []
for i in range(m):newline = [1] * (i+1)for j in range(2, i+1):newline[j-1] = oldline[j-1]+oldline[j-2]oldline = newlineprint(newline)

运行结果

 其中通过计算比较,第五种方法一次性开辟内存空间的方法要比第一种方法中,每次计算通过append添加新的内存空间要快。

7.yield函数

利用yield函数可以将L定义为生成器

代码

def triangles():L = [1]              #定义L为一个只包含一个元素的列表while True:yield L          #定义为生成器函数L =[1] + [L[n] + L[n-1] for n in range(1,len(L))] + [1]n = 0
for t in triangles():print(t)n = n + 1if n == 10:break

8.zip函数

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

思路

 杨辉三角特性:

代码

def triangles():n = [1]while True:yield nn = [x+y for x,y in zip([0] + n,n+[0])]n = 0
for t in triangles():print(t)n = n + 1if n == 10:break

 运行结果

 

参考资料链接:

杨辉三角的几种解法(python)_vampire's blood的博客-CSDN博客_杨辉三角python

python——杨辉三角 - 我听过 - 博客园

python打印杨辉三角的两种方法及详解 - 简书

杨辉三角形(超级简单的Python实现方法)_3Sunremitting的博客-CSDN博客_python杨辉三角

Python yield 使用浅析 | 菜鸟教程

Python3 zip() 函数 | 菜鸟教程


http://chatgpt.dhexx.cn/article/kEPdrL2r.shtml

相关文章

c++自定义函数

对于小型应用程序来说不设计自定义函数完全可行,但随着程序越来越大,越来越复杂,实现的功能越来越多,如果不使用函数,main函数将变的越来越复杂越来越雍肿越来越令人难懂,而在更改程序的每一个功能的时候&a…

C++ 自定义函数

C的函数分两种: 今天,我们就来讲一下自定义函数。 好了,自定义函数讲完了,若想了解其他关于自定义函数的内容,请点击下面方框: C递归算法_闪耀的天狼星的博客-CSDN博客_c递归算法汉诺塔大家都玩过吧&#…

C语言:自定义函数实现对字符串的复制

#include <stdio.h> void f(char*str1,char*str2)//函数名为f&#xff0c;自定义字符串连接函数 {int i0;while(str2[i]!0) {str1[i]str2[i];//把b复制到a中i;}str1[i]\0;//添加字符串结束符 } int main() {char a[100],b[100];puts("请输入字符串:\n");gets…

C语言之自定义函数(综合)

//设定一个函数&#xff0c;来比较两个数之间的较大值 int get_max(int x, int y) {int z 0;if (x > y)z x;elsez y;return z;} int main() {int a 10;int b 20;int maxget_max(a, b);printf("%d", max);return 0; } //函数返回类型的地方写出&#xff1a;vo…

[C语言] 函数:库函数--自定义函数--函数的调用--练习--详解<个人>------(1)

文章目录 前言一. 函数是什么&#xff1f;二. C语言中函数的分类三. 库函数四. 自定义函数五. 函数的调用六. 练习总结 前言 本节内容主要记录函数的相关内容&#xff0c;其中包括&#xff1a;库函数&#xff0c;自定义函数&#xff0c;函数的调用&#xff0c;函数的习题练习。…

C语言中的函数 | 库函数和自定义函数

写在前面: 今天我们需要学习和了解的是C语言中的函数,其中C语言的函数划分为库函数和自定义函数两种.接下来我们一起探究两者之间的关系. 一.C语言中函数的分类 库函数自定义函数 二.库函数 库函数到底是什么呢? 顾名思义,可以通俗的理解为库里面的函数.这些函数都是频繁使…

c++自定义函数简单介绍

大家好&#xff0c; 今天给大家介绍一下自定义函数。 如有错误请在评论区指出 正文&#xff1a; 1.简单介绍&#xff1a; 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数&#xff0c;即主函数 main() &#xff0c;所有简单的程序都可以定义其他额外的函数…

C语言入门系列 - 自定义函数

C语言入门系列 - 自定义函数 第一节 C 语言基础以及基本数据类型 第二节 C 语言运算符 第三节 C 语言控制语句 第四节 C 语言自定义函数 第五节 C 语言修饰变量的关键字 第六节 C 语言构造数据类型–数组 第七节 C 语言字符串 第八节 C 语言指针 第九节 指针与函数、指针函数、…

C语言-函数(自定义函数)

C语言中函数的分类&#xff1a; 1 库函数 2 自定义函数 自定义函数 如果库函数能干所有的事情&#xff0c;那还要程序员做什么&#xff1f; 所以更重要的是自定义函数 函数的组成&#xff1a; ret_type fun_name (part1) { statement; //语句项 &#xff08;函数体&…

C语言自定义函数使用

补充1&#xff1a;优先级&#xff0c;解答问题区分*p,*p0,*p0 <1>.首先要理解前后置的区别&#xff0c;前置&#xff0c;先计算后使用&#xff1b;后置&#xff0c;先使用后计算。 可用示例理解&#xff1a; <2>.其次要理解操作符的优先级 优先级从高到低&#…

C语言【库函数与自定义函数】详解

文章目录 一.什么是函数二.库函数1. 什么是库函数2. 为什么会有库函数&#xff1f;3.使用库函数的注意事项4.对学习库函数的建议 三.自定义函数1.什么是自定义函数2.自定义函数举例 一.什么是函数 提起函数&#xff0c;我们可能并不陌生&#xff0c;我们可能会联想到数学中的函…

C语言中的函数(重点介绍自定义函数)

C语言中的函数分为库函数和自定义函数&#xff0c;本篇重点介绍自定义函数中的函数调用 函数由一个或多个语句块组成&#xff0c;负责完成某项特定任务&#xff0c; 相较于其他代码&#xff0c;具有相对的独立性&#xff0c;一般会有返回值和输入参数&#xff0c;提供对过程的封…

C语言自定义函数的声明

C语言函数为什么要声明呢&#xff1f;我们在创建自定义函数的都知道要将自定义子函数放在主函数前面那么是为什么呢&#xff1f;可不可以不放在前面呢&#xff1f;小问号你是不是也一样有很多朋友呢&#xff1f; 答案是可以不把我们自己的自定义子函数放在前面&#xff1f;但是…

c语言函数详解1——自定义函数

这篇文章理论性知识比较多&#xff0c;不过对于初学者对于函数的理解会有更深层次的帮助 目录 c语言的函数——子程序 自定义函数 c语言的函数——子程序 *是大型程序中的某部分代码&#xff0c;由一个或者多个语句组成&#xff0c;她负责完成某项特定的任务&#xff0c;相较…

自定义函数

目录 一、自定义函数 二、函数参数 、传值调用和传址调用 2、1 传值调用 2、2 传址调用 三、函数的嵌套和链式访问 四、函数递归 一、自定义函数 C语言中有两类函数&#xff0c;一类是库函数&#xff0c;另外一类是自定义函数。自定义函数从字面意思上理解就是自…

C语言自定义函数

函数定义 return_type function_name([datatype1 arg1],[datatype1 arg2],...) { //函数体 } 函数三要素 返回值类型 函数名 参数列表 自定义函数的完整写法 #include <stdio.h> // 函数原型 int sum(int,int); // 调用函数 int main() { int sum(); } // 函数定义 i…

学习pyqt 继承中self的疑问

前面学习了&#xff0c;面对对象编程&#xff0c;继承&#xff0c;有了一些理解。继续学习pyqt5 看到下面有了一些疑问。 import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QIconclass Example(QWidget):def __init__(self):super().…

Python中类函数中self是什么

首先我们来看两组代码运行的结果 代码组一&#xff1a; class C1:def func1():x10print("func1的x&#xff1a;",x)def func2(self):x20print("func2的x&#xff1a;",x)C1.func1() C1.func2()结果如下 代码组二&#xff1a; class C1:def func1():x…

python中return self用法详解

直接上代码来理解return self的用法&#xff01; 示例代码1&#xff1a; class Test(object):def __init__(self):self.age 25def add(self):self.age 1print(self.age)obj Test() obj.add()运行结果&#xff1a; 有时候当我们想对实例对象的方法进行连续调用时&#xff0…

Python——self参数

self 的意思是“自己”,表示的是对象自身,当某个对象调用成员方法的时候,Python 解释器会自动把当前对象作为第1个参数传给 self ,用户只需要传递后面的参数就可以了。 self 参数的应用&#xff1a; #program0706.py self 参数的应用 class Animal:类中未定义构造方法&#x…