00:00
那我们已经学习了for推导式里边的这么多特性之后,接下来我们就来做一个综合练习,这个练习呢,是要求我们打印输出一个比较特殊的图形啊,这个图形叫做一个九层妖塔啊,那所谓的九层妖塔是什么东西呢?其实就是放的一个类似于。等腰三角形的一个东西,只不过我们输出的呢,不是等腰三角形,因为你在屏幕当中没有办法控制台输出这样一个图形吧,我们现在输出的就是星号,很多个星号,一层一个星号。第二层呢,三个星号。以中间这个为基准,两边对称的,呃,增加一个芯,然后第三层对应的啊,就是五个星号。依次类推。一直要我们要把九层。这样的星号打印出来,所以最终看起来就像是这样的一个等腰三角形,我们把它叫做一个九层腰塔啊,或者这其实就是一个金字塔嘛,啊,大家就是想要输出这样一个金字塔式的图形,我们来看一看怎么样能够输出。
01:13
所以接下来我们在代码里边新建一个测试的文件,还是的一个object,现在我们把它叫做TEST04,这个还是一个practice,这个金字塔啊,我们直接写这个pyramid。没方法,我们现在要实现的是打印输出一个九层妖塔。那这里面具体实现的话,应该怎么定义呢?那大家自然想到了,最后我们要实现的是这样的一个星号啊,每一行有很多个星号这样的一个图形,那自然我就要计算一下每一行有多少个星号了啊,然后可能用一个for循环,然后把这么多个星号直接打印输出就行了,那另外呢,呃,大家可能会想到,其实我也没必要再用一一重for循环了,我可以怎么样呢?每一行只要算出这个星号有几个,大家还记得之前我们那个字符串输出的时候,是不是可以有有一个乘法操作啊,也是芯儿对吧?啊,就是比方说一个字符串A。
02:25
算出来有三个的话,乘以三,那输出的是不是就是AAA啊,诶,所以我可以就是算出来这个当前这一行星号有几个,有N个的话,我直接星号乘以N,那最后输出的不就是它完整的这个个数吗?啊,所以这个还是比较容易想到的一个方便的处理过程,那最麻烦的其实是什么呢?其实是除了这个星号的个数之外,我前面是不是还得空格啊啊,因为大家看到最后我其实一行一行如果最终要输出的话。如果前边我希望顶格输出,其实最终我是要以最后一行第九层的。
03:09
这个状态为基准的。第九层呃,大家应该能够想到啊,我一直扩充的话,这个星号应该有几个呢?哎,那就跟他这个星号的个数有关系了啊,第一行有一个,第二行有三个,第三行有五个,诶那家看这不就是。2N。减一这样的一个,呃,按照如果N是当前的这个行号或者说是层数的话,那当前的这个星号个数不就是2N减一吗?从一开始取啊啊,那就是13579,那最后一行第九行是不是就第九层是不是就应该有17个星号啊哦,那那所以如果中间有17个星号的话,最。左边。最底层的第九层它是顶格的话,那大家想前边的第一层应该空多少格呢?
04:06
因为两边对称,那是不是就是减掉这一之后,剩下的16个应该平均分配啊啊,那前面是不是就是应该要空八格啊,哎,那所以这里边我们就想到了当前,呃,其实就是基于最后一个。第九层啊,第九层的17个星号前边我们要空,要空多少格呢?哎,那就是当前按照这个层数,如果是第一层的话。就前面减掉一之后,然后要再除以二对吧?呃,那那这里边就是减掉一个数,然后除以二,那如果要是第二行呢,这里面要减掉的就应该是减掉三再除以二了,哎,所以其实就是减的当前的星号的个数嘛,哎,所以当前其实就是17点减掉2N减一,然后再除以二。这个如果完全展开的话,大家把这个做一个计算,这不就是17啊减2N,然后再加一不就是18减2N吗?除以二就是九减N,其实就是这样的一个计算啊,那所以我们现在就已经知道了,每一行啊,第N行应该有2N减一个星号,而且前面要空九减N个空格。
05:23
啊,那自然我们就想到了,接下来是不是就用一个引入变量就可以非常方便的实现啊,啊,那或者一开始如果大家还对这个引入变量太了解,不太熟悉的话啊,我们还还是可以写成这个最原始的情况,我们用I来表示当前的行号,那当然就是一到九啦,然后接下来我们可以定义一个比方说把这个叫做stars之前的新的个数。那当前新的个数不就是我们说的2I减一嘛,二乘以I,然后一,那另外还有一个空格的个数spaces,其实就是和我们推出来是读减I,那最终我们打印输出,应该打印输出什么呢?其实就是直接line,然后当前有多少个空格,那就是空格乘以V个数,然后再加上。
06:25
呃,加上星号横以应的星号的个数大,这不就是我们对应的这个定义吗?所以整体来讲的话,直线还是非常简单的啊,大家可以看一下,我们最后输出的结果就是这样的一个金字塔,这就是我们所谓的九层妖塔。那当然了,我们学习了这个引入变量,对应的当前的这个实现,其实可以做一个简写,怎么样简写呢?那就是当前的循环变量还是I从一九。
07:01
然后后边,哎,当前的这个stars。等于二乘以I减一,然后后边的VS等于九减I直接放在这就完事了,里边还是直接print line,所以这样的话就看的非常的清晰,甚至呃,大家如果觉得这个stars spaces这样是看起来更加的好理解一点啊,如果大家直接想把这个定义成J和K的话,其实也是一样的啊,这个是完全没有影响的啊啊呃,这是另外的一种实现,我们运行一下的话,会发现得到的结果还是完全一样。也是这样的一个等腰三角形金字塔,呃,那另外还有一种其他的实现哈,呃,大家可以发现就是如果说我们这里边,呃,大家看到这个stars是跟爱有关,Spaces也是跟爱有关,那如果要是直接这么看的话,最后这个stars和spaces,我们最后要输出的这个个数不就是他俩吗?那它俩之间是不是本身就应该是通过I能够关联起来,它俩之间有一个关系啊。
08:07
所以当前我甚至连爱都不需要去便利,因为这就跟爱没关系嘛,我想要的就是stars和spaces嘛。我只要把他俩的关系找到了便利其中的一个,那另外一个不就也也得到了吗?哎,所以当前其实可以做这样的一个判断,那当前大家可能看到了啊I如果要是从一到九的话。那当前的stars是多少呢?从多少到多少呢?呃,其实它就应该是从一到17对吧?哎,所以我当前可以直接这样的一个一直接定义stars。它是从一到17,注意它是只取奇数,所以要有一个不长A2,然后接下来呢,单独的再去定义一个spaces。
09:01
知道spaces它本身是九减,那它抑于这个stars又应该怎么样去呃得到这个spaces呢?这不就是一个简单的变量替换吗?哎,你通过前面的这个定义,Stars等于2I减一,那反过来I是不是就等于1/2的stars加一啊?那所以我们把后面这个I替换成1/2的stars加一不就完了吗?而这里面大家会看到,就是前边我们这里的这个stars是从一到17,然后每隔两个取一个啊,然后最后你把这个解出来之后啊,大家看到是有减。二分之。Stars,我直接简写叫做这个ST啊加一。那如果要是把这个九在合并到里边的话,这不就又变成了17/2减stars吗?啊,所以其实就是这样的一个形式,我们之前其实也能推断出他们之间的这个关系嘛啊,所以接下来我就可以直接把这个写成直7.s,然后再除以二二。
10:24
里边我们写错了,应该是这个推导式的表表达,而是引入变量的表达,VS直接等于17减stars,然后除以二就可以了啊,然后接下来,那当然还是同样的直接print line in。我们可以运行看到后的结果还是一模一样啊,所以同样的这一道问题啊,我们可以有各种不同的解法,大家可以选取一个自己最好理解的方式啊,我个人认为可能还是中间的这种方式啊,引用两个引入变量代码会更加的清晰一点,也更加好理解一点,大家可以下来之后把这个做一个练习。
我来说两句