“杨辉三角”——我的“草根算法”和CSDN“每日一练”题目答案的差距


Python 官网:https://www.python.org/


  • Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……

  • My CSDN主页、My HOT博、My Python 学习个人备忘录
  • 好文力荐、 老齐教室

  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


等风来,不如追风去……



练习
“杨辉三角”
——我的“草根算法”和CSDN“每日一练”题目答案的差距




  我观其形态,定义好“杨辉三角”一、二行,用既定“规律”递归出第三行始的new_row,实现了“杨辉三角”的打印。比之前写的代码,“优雅”了一些。

class PascalsTriangle:
    ''' 杨辉三角 '''
    

    def __init__(self): # 自动打印标题行。
        print(f"\n\n{' 杨辉三角 ':~^46}\n\n")


    def get_triangle(self, row_index):
        ''' 生成杨辉三角 '''

        for i in range(row_index):
            row_list = list(map(lambda x: f"{x:^3}", self.new_row(i))) # 插值字符串格式化获取到的第二行外的新行每个元素占位三个字符。
            print(f" {' '.join(row_list)} ".center(50, '~')) # 用半角空格拼接打印row。

        print(f"\n{' 梦幻精灵_cq ':~^46}\n")



    def new_row(self, n):
        ''' 杨辉三角第n行 '''

        if n == 0: # 杨辉三角第一行。
            return [1]

        if n == 1: # 杨辉三角第二行。
            return [1, 1]

        if n > 1: # 递归生成第二行以后的行。
            row = [1] # 行首始终是“1”。

            for i in range(len(last_row := self.new_row(n-1))-1): # 递归从杨辉三角第n-1行生成第n行除首尾以外的元素。
                row.append(last_row[i]+last_row[i+1]) # 追加从上一行元素按规则获取到的new_row元素。

        row.append(1) # 追加行尾的“1”。
        return row # 返回杨辉三角第n行列表。


if __name__ == '__main__':
    PascalsTriangle().get_triangle(12) # 打印“杨辉三角”前十三行。

“杨辉三角”——我的“草根算法”和CSDN“每日一练”题目答案的差距_第1张图片

class Triangle:
    ''' “杨辉三角——”抄录CSDN“每日一练” '''

    def get_triangle(self, row_index):
        pas = [1] # 初始化“杨辉三角”第一行。

        if row_index == 0:
            return pas # row_index为零,返回“杨辉三角”第一行。

        print(f"{pas[0]:^3}".center(50, '~')) # 插值字符串格式化三个字符占位打印“杨辉三角”第一行。

        for i in range(row_index): # 循环用前后+[0]补位的方式对齐当前行需相加元素,用map函数遍历相加求取new_row。
            pas = list(map(lambda x,y: x+y, [0]+pas, pas+[0])) # map求取new_row。
            print(f"{' '.join(list(map(lambda x: f'{x:^3}', pas))):~^50}") # 插值字符串格式每个元素三个字符占位打印求取的new_row。



if __name__ == '__main__':
    Triangle().get_triangle(12) # 打印前十三行“杨辉三角”。

  “捋顺”了CSDN题目中的算法,感觉比我的观测“杨辉三角”形态所得“草根算法”,是实在太优雅。(修改打印输出语句,成了我的“样子”,但也臃肿了代码。原来是返回new_row的。)

“杨辉三角”——我的“草根算法”和CSDN“每日一练”题目答案的差距_第2张图片


本练习完整源码

#!/usr/bin/nve python
# coding: utf-8


'''

filename = 'practice220711.py'

author = '梦幻精灵_cq'

time = '2022-07-11'

'''


class Triangle:
    ''' “杨辉三角——”抄录CSDN“每日一练” '''

    def get_triangle(self, row_index):
        pas = [1] # 初始化“杨辉三角”第一行。

        if row_index == 0:
            return pas # row_index为零,返回“杨辉三角”第一行。

        print(f"{pas[0]:^3}".center(50, '~')) # 插值字符串格式化三个字符占位打印“杨辉三角”第一行。

        for i in range(row_index): # 循环用前后+[0]补位的方式对齐当前行需相加元素,用map函数遍历相加求取new_row。
            pas = list(map(lambda x,y: x+y, [0]+pas, pas+[0])) # map求取new_row。
            print(f"{' '.join(list(map(lambda x: f'{x:^3}', pas))):~^50}") # 插值字符串格式每个元素三个字符占位打印求取的new_row。



if __name__ == '__main__':
    Triangle().get_triangle(12) # 打印前十三行“杨辉三角”。



class PascalsTriangle:
    ''' 杨辉三角 '''
    

    def __init__(self): # 自动打印标题行。
        print(f"\n\n{' 杨辉三角 ':~^46}\n\n")


    def get_triangle(self, row_index):
        ''' 生成杨辉三角 '''

        for i in range(row_index):
            row_list = list(map(lambda x: f"{x:^3}", self.new_row(i))) # 插值字符串格式化获取到的第二行外的新行每个元素占位三个字符。
            print(f" {' '.join(row_list)} ".center(50, '~')) # 用半角空格拼接打印row。

        print(f"\n{' 梦幻精灵_cq ':~^46}\n")



    def new_row(self, n):
        ''' 杨辉三角第n行 '''

        if n == 0: # 杨辉三角第一行。
            return [1]

        if n == 1: # 杨辉三角第二行。
            return [1, 1]

        if n > 1: # 递归生成第二行以后的行。
            row = [1] # 行首始终是“1”。

            for i in range(len(last_row := self.new_row(n-1))-1): # 递归从杨辉三角第n-1行生成第n行除首尾以外的元素。
                row.append(last_row[i]+last_row[i+1]) # 追加从上一行元素按规则获取到的new_row元素。

        row.append(1) # 追加行尾的“1”。
        return row # 返回杨辉三角第n行列表。


if __name__ == '__main__':
    PascalsTriangle().get_triangle(12) # 打印“杨辉三角”前十三行。

在这里插入图片描述


回首页

__上一篇:__ python实现Linux的目录tree

__下一篇:__ 重建我的color工具——(用初通Python之class全新修葺)

我的HOT博:
  • 练习:银行复利计算(用 for 循环解一道初中小题)(1067阅读)
  • pandas 数据类型之 DataFrame(1404阅读)
  • 班里有人和我同生日难吗?(概率probability、蒙特卡洛随机模拟法)(2108阅读)
  • Python字符串居中显示(1544阅读)
  • 练习:求偶数和、阈值分割和求差( list 对象的两个基础小题)(1649阅读)
  • 用 pandas 解一道小题(1976阅读)
  • 可迭代对象和四个函数(1070阅读)
  • “快乐数”判断(1232阅读)
  • 罗马数字转换器(构造元素取模)(1941阅读)
  • Hot:罗马数字(转换器|罗生成器)(3780阅读)
  • Hot:让QQ群昵称色变的代码(28313阅读)
  • Hot:斐波那契数列(递归| for )(4049阅读)
  • 柱状图中最大矩形(1656阅读)
  • 排序数组元素的重复起止(1243阅读)
  • 电话拨号键盘字母组合(1353阅读)
  • 密码强度检测器(1813阅读)
  • 求列表平衡点(1820阅读)
  • Hot: 字符串统计(4289阅读)
  • Hot:尼姆游戏(聪明版首发)(3429阅读)尼姆游戏(优化版)(1040阅读)
推荐条件 点阅破千

回目录


老齐漫画头像

精品文章:

  • 好文力荐:《python 完全自学教程》齐伟书稿免费连载
  • OPP三大特性:封装中的property
  • 通过内置对象理解python'
  • 正则表达式
  • python中“*”的作用
  • Python 完全自学手册
  • 海象运算符
  • Python中的 `!=`与`is not`不同
  • 学习编程的正确方法

来源:老齐教室


回目录

Python 入门指南【Python 3.6.3】

好文力荐:
  • 全栈领域优质创作者——寒佬(还是国内某高校学生)好文:《非技术文—关于英语和如何正确的提问》,“英语”和“会提问”是学习的两大利器。

  • 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛

  • 靠谱程序员的好习惯


CSDN实用技巧博文:

  • 8个好用到爆的Python实用技巧
  • python忽略警告
  • Python代码编写规范
  • Python的docstring规范(说明文档的规范写法)

你可能感兴趣的:(练习,python)