趣味数学

2021-07-23 17:36陈新龙
电脑报 2021年23期
关键词:个数列表绘制

陈新龙

杨辉三角是二项式系数在三角形中的一种几何排列,在南宋数学家杨辉在1261年所著的《详解九章算法》一书中出现,杨辉三角的出现是数学史上一个伟大的成就,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,形成一个无限对称的数字金字塔,这是一种离散型的数与形的结合(如图1)。

1.算法分析

那么今天就和大家一起探讨一下如何用Scratch和Python绘制出杨辉三角,别看杨辉三角这么复杂,但是只要我们分析出其中的规律自然就可以克服困难(如图2)。

通过观察我们发现杨辉三角的两个腰上的数都是1,如图2所示相加关系用箭头标识,中间位置的数都是它顶上两个数之和。因此杨辉三角的每行首尾数都为1,中间每个数等于它上方两数之和,比如第二行的数为【1,1】,第三行【1,2,1】其中的数字2是第二行的数1+1之和(如图3)。

且每行数字左右对称,由1逐渐变大,第n行的数字有n项,我们还可以总结出一个规律(a+b)nn的展开式中的各项系数依次对应杨辉三角的第(n+1)行中的每一项。

2.在Scratch中计算

我们可以利用上一行的数据计算出杨辉三角的下一行数据,因此可以定义两个列表,其中a列表存储上一行的数据,b列表存储a列表各项两两相加的结果,这样就获得了下一行的除首尾两个1以外的数据,将b列表首尾各加1个1之后存入新的a列表获得下一行的全部数据(如图4)。

初始的情況下我们给列表a添加了两个数字【1,1】,代表杨辉三角的第二层;1+1=2获得列表b;给b的首位和末位加上1,就能获得第三层的数据【1,2,1】,让程序把a列表的数据清空,将刚刚获得的b列表内容在首位和末位加1存储到a里面,如此一层一层地循环到需要的层数后输出就可以了(如图5)。

3.在Scratch中绘制

我们通过找规律,成功将图形转化为了数据,解决了数据来源问题。由于Scratch不能像Python或者c语言那样将列表中的数据直接显示到舞台上,所以我们得想个办法让数字角色根据已知数据排列成我们需要的杨辉三角。

从角色库中添加数字造型0-9,全部数字造型在一个角色中。现在我们只需要根据不同的数字切换出不同的造型,利用画笔里的图章将数绘制在舞台上。还需要让这些数字根据需要排列在合适的位置上(如图6)。

第一行位置就定在舞台中线正上方,下一行需要根据实际情况去测试和调整。经过测试找到了一个合适的间距,为了方便调整我使用了公式:【x:0-20(行数-1),Y:Y坐标-30】,行间距为30,数字之间的间距为30。

这个时候不知道你有没有注意到一个问题,我们如果要输出两位数甚至三位数该怎么办呢?比如要输出15,但我们的角色只有0-9,这个时候我们可以使用拆分的方法,将多位数独立拆出来。1放在前面,移动x坐标12,5放在后面,结合起来就是数字15了,用一个循环嵌套解决了输出多位数的烦恼(如图7)。

以上把用Scratch绘制杨辉三角所遇到的难题全部解决了,接下来我们可以按照整体的思路框架搭建主程序,最终可以看到我们运行后的结果了。图中看到等腰三角形效果,由于到下层数字越来越大,占据的宽度也越来越大,所以整体会慢慢向右移动,后期我们还可以优化调整(如图8)。

4.在Python中绘制杨辉三角

在已经分析出算法的情况下,我们再一起来思考如何用PVthon做出杨辉三角的造型。下面我会给大家展示两种不同的做法,普通方法和进阶方法两者大家都可以尝试。

这个方法算法与刚才Scratch的算法一致,定义dict temp变量用来存放杨辉三角中的数值,首先赋予i变量范围range(1,11)代表行数,接下来赋予i变量范围(0,i)代表每行的个数,第一行一个,第二行两个……每行首尾数字都是1,中间数字等于上一行的左右两个数字之和,即第n+l行的第i个数等于第n行的第i-1个数和第i个数之和。即dict temp(i-1,1)+dict_ternp(i-1,j-1)得出结果后我们根据dict ternp中的内容进行输出便可以显示出对应的杨辉三角。

创建列表nz=[1]。增加一个外循环控制行数,在循环中增加两个条件,第一个条件是控制每行的个数,第二个条件是控制每行输出的数字,首先我们输出变量n,接下来给n末尾添加一个数0,通过一个循环对数进行控制n=z[n[k]+n[k 1]for k in range(i+2)]。比如第二行的内容是【1,1】,通过循环n[k]+n[k-1]等于【1,2,1】,这样大大节约了代码量,但是提高了代码的认知难度。

现在代码只是有了正确的数字,但这些数字还没有在正确的位置上,需要你用合适数量的空格来填满。

猜你喜欢
个数列表绘制
Painting ski maps 绘制滑雪地图
绘制童话
扩列吧
绘制世界地图
最强大脑
列表法解分式方程问题探索
想一想
神秘的不速之客
列表画树状图各有所长
认识频数分布直方图