网站首页
手机版

少儿Python每日一题(22):杨辉三角

更新时间:作者:小小条

原题解答

本次的题目如下所示:

杨辉三角形又称Pascal三角形,它的第i+1行是的展开式的系数。

它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
1
1 1
1 2 1
1 3 3 1
给出n,输出它的前n行。

少儿Python每日一题(22):杨辉三角

输入:

输入包含一个数n。

输出:

输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。

输入样例:

4

输出样例:

1

1 1

1 2 1

1 3 3 1

这道题我们先要寻找规律,看一下每一行中的数字是如何来的。首先,第n行有n个数,左右两端的数字永远都是1,而中间的数字来源于上面一行相邻两个数相加的和。即a[i][j] = a[i-1][j-1] + a[i-1][j]。

​ 杨辉三角的规律

(以上图片来源于网络,如有侵权请联系)

通过以上规律我们可以一行一行推出杨辉三角了:

第一行a[0][0] = 1第二行a[1][0] = 1 a[1][1] = 1第三行a[2][0] = 1 a[2][2] = 1,a[2][1] = a[1][0] + a[1][1]第四行a[3][0] = 1 a[3][3] = 1,a[3][1] = a[2][0] + a[2][1],a[3][2] = a[2][1] + a[2][2]……

当j = 0或i = j时,值为1;当i ≠ j时,值为上一行相邻两数相加。通过以上规律,我们很容易都可以得到代码:

n = int(input())a = [] # 存放杨辉三角for i in range(n): t = [0] * (i + 1) # 第i行有i个元素 for j in range(i + 1): if j == 0 or i == j: t[j] = 1 # 第一个元素和最后一个元素都是1 else: t[j] = a[i-1][j-1] + a[i-1][j] a.append(t)for row in a: for i in row: print(i, end=' ') print()

这道题除了使用递推算法外,还可以使用递归算法解决:

我们看杨辉三角除了上述规律外,还可以找出这样的规律:

[1,1] = [0,1] + [1,0]
[1,2,1] = [0,1,1] + [1,1,0]
[1,3,3,1] = [0,1,2,1] + [1,2,1,0]
[1,4,6,4,1] = [0,1,3,3,1] + [1,3,3,1,0]

相当于第n行等于第n-1行分别首尾补0,然后按位相加。

因此我们可以使用递归的方法解决这道问题,具体代码如下:

def triangle(n): t = [1] if n == 0: return t return [x + y for x, y in zip([0] + triangle(n - 1), triangle(n - 1) + [0])]n = int(input())for i in range(n): print(*triangle(i))

本题拓展

本题考查的是递推算法和递归算法,题目难度★★★★★

涉及到递推算法的题型最关键的地方在于找规律,找规律的过程相当于做一道数学题。当我们得到相应的规律时,题目的代码就迎刃而解了。而此类题目的难点就在于找规律上,对于数学的要求较高,因此使用递推算法处理的问题难度一般较高。

使用递推算法解决的问题还有很多,我们看下面一道题目:

N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式。
输入:
输入包括一个整数N。
输出:
输出当楼梯阶数是N时的上楼方式个数。
输入样例:
6
输出样例:
13

这道题我们分析一下如何能找到它的规律:

如果只有1个台阶,很明显只有1种可能性。如果有2个台阶,有2种可能性如果有3个台阶,我们可以先到第1个台阶,从第1个台阶到第3个台阶有2种可能性;也可以先到第2个台阶,再到第3个台阶有1种可能性。因此1 + 2 = 3,共3种可能性。如果有4个台阶,我们可以先到第2个台阶,再从第2个台阶到第4个台阶;也可以先到第3个台阶,然后从第3个台阶到第4个台阶。……

因此可以得到以下规律:

f(1) = 1f(2) = 2f(n) = f(n + 1) + f(n + 2)

通过这个规律,我们可以将结果存入列表中,逐个递推就可以得到程序的代码如下:

n = int(input()) f = [0] * n # f[i] 为 i + 1级台阶的可能性f[0] = 1f[1] = 2for i in range(2, n): f[i] = f[i - 1] + f[i - 2]print(f[n - 1]) # 最后一个元素为我们需要对答案

同样,我们也可以使用递归的方式处理这个问题:

def f(n): if n == 1: return 1 elif n == 2: return 2 else: return f(n-1) + f(n-2)n = int(input())print(f(n))

写在最后:能够使用递推解决的问题,首选使用递推,只有在实在写不出递推的情况下才使用递归。因为递归的效率是明显低于递推的。

版权声明:本文转载于今日头条,版权归作者所有,如果侵权,请联系本站编辑删除

为您推荐

数学之美:神奇的杨辉三角形,比西方早近600年,致敬古代数学家

小朋友们好,大朋友们好!我是猫妹,一名爱上Python编程的小学生。和猫妹学Python,一起趣味学编程。今日主题什么是杨辉三角形?杨辉三角形有什么规律?中国古代数学家杨辉。西方科学家

2026-01-14 23:29

妙笔绘英魂,丹心颂脊梁——临沂启航中学七年级语文“国之脊梁”手抄报大赛

在浩瀚的历史长河中,总有一些身影挺立潮头,以坚韧不拔之志,书写着国家的辉煌篇章。他们,是民族的脊梁,是时代的先锋,用汗水与热血铸就了不朽的传奇。为弘扬爱国精神,深化学生对“国

2026-01-14 23:29

家长最高级的陪伴:闭嘴给空间,开口给温暖

一、为什么我们总是“说太多”?中国青少年研究中心的数据显示:高中生最反感的父母行为中,“不停唠叨”高居榜首。可我们为什么控制不住?因为我们焦虑。高考倒计时像悬在头顶的剑

2026-01-14 23:28

济南高中规划机构推荐:2026升学季家长必看的全维度选择指南

济南高中规划机构推荐:2026升学季家长必看的全维度选择指南《2026中国高中升学规划行业白皮书》数据显示,全国超80%的高中生及家长对“选科-志愿-多元路径”的关联逻辑认知模

2026-01-14 23:28

给高一家长的一封信:如何做孩子情感探索路上的 “合伙人”

洞察:当代高中生的情感 “新画像”身处信息爆炸与价值观多元的时代,现在的孩子们呈现出以下几个鲜明的特点:1. 情感取向的 “去标签化”现在的青少年对情感的理解更加包容。许

2026-01-14 23:27

高中生物学到底有多难?看完这篇我顿悟了

曾被高中生物支配的我,得出了一个奇奇怪怪的结论:生物是理科中的文科,是文科中的理科。生物是一个很中性的科目——需要背书,也需要用理科思维做题。很多小伙伴说,生物知识点不

2026-01-14 23:27