• Python算法图解——递归(三):打印九九乘法表


    Python算法图解——递归(三):打印九九乘法表

    本系列内容来自何韬编著的《Python算法图解》

    递归:程序调用自身的编程技巧。
    它通常把一个大型复杂的问题,层层转换为一个与原问题相似的规模较小的问题来求解。
    在某些情况下,它能解决 for 循环难以解决的算法问题,有时只需少量的代码就可描述出解题过程所需要的多次重复计算,大大减少了代码量。

    在程序实现中,递归往往以调用的方式存在。
    递归调用:声明一个方法,并在这个方法中设定条件,在此条件下调用自身方法,也就是在方法中自己调用自己,如果不符合条件则停止调用。

    九九乘法表:
    第1行:1×1=1
    第2行:1×2=2 2×2=4
    ……

    开始实现:

    def F(n):  # 首先不嵌套
        print("第{}行:".format(n), end="\t")
        for i in range(1, n+1):
            print("{}*{}={}".format(i, n, i*n), end="\t")
            
    F(4)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    第4行:	1*4=4	2*4=8	3*4=12	4*4=16	
    
    • 1
    def multi(n):  # 考虑嵌套
        if n >= 1:
            multi(n-1)
            print()  # 表示换行,这里如果写print("\n"),反而会每两行之间都有空行
            print("第{}行:".format(n), end="\t")
            for i in range(1, n+1):
                print("{}*{}={}".format(i, n, i*n), end="\t")
    multi(9)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    第1行:	1*1=1	
    第2行:	1*2=2	2*2=4	
    第3行:	1*3=3	2*3=6	3*3=9	
    第4行:	1*4=4	2*4=8	3*4=12	4*4=16	
    第5行:	1*5=5	2*5=10	3*5=15	4*5=20	5*5=25	
    第6行:	1*6=6	2*6=12	3*6=18	4*6=24	5*6=30	6*6=36	
    第7行:	1*7=7	2*7=14	3*7=21	4*7=28	5*7=35	6*7=42	7*7=49	
    第8行:	1*8=8	2*8=16	3*8=24	4*8=32	5*8=40	6*8=48	7*8=56	8*8=64	
    第9行:	1*9=9	2*9=18	3*9=27	4*9=36	5*9=45	6*9=54	7*9=63	8*9=72	9*9=81	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这样的问题是在一开始多了一个空行,如果要坚持multi(9),就得对n=1的情况分类讨论,所以下面干脆用输入multi(1)来算:

    def multi(n):  # 考虑嵌套
        if n <= 9:
            print("第{}行:".format(n), end="\t")
            for i in range(1, n+1):
                print("{}*{}={}".format(i, n, i*n), end="\t")
            print()
            multi(n+1)  # 如果这一步在if循环外,则会一直走向multi(∞),只是没有进入if循环打印而已,因此会报错
    multi(1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    第1行:	1*1=1	
    第2行:	1*2=2	2*2=4	
    第3行:	1*3=3	2*3=6	3*3=9	
    第4行:	1*4=4	2*4=8	3*4=12	4*4=16	
    第5行:	1*5=5	2*5=10	3*5=15	4*5=20	5*5=25	
    第6行:	1*6=6	2*6=12	3*6=18	4*6=24	5*6=30	6*6=36	
    第7行:	1*7=7	2*7=14	3*7=21	4*7=28	5*7=35	6*7=42	7*7=49	
    第8行:	1*8=8	2*8=16	3*8=24	4*8=32	5*8=40	6*8=48	7*8=56	8*8=64	
    第9行:	1*9=9	2*9=18	3*9=27	4*9=36	5*9=45	6*9=54	7*9=63	8*9=72	9*9=81	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    redux、mobx
    一顿操作猛如虎,3000 行代码重构成 15 !
    【摸鱼神器】UI库秒变低代码工具——表单篇(二)子控件
    STL概论与组成
    ​LeetCode解法汇总2864. 最大二进制奇数
    Minio 文件上传(后端处理同文件判断,同一文件秒传)
    Linux之httpd及虚拟主机的配置及使用
    MySQL——子查询
    手把手带你学会Odoo OWL组件开发(7):OWL项目实战使用
    无头单向非循环链表(C语言实现)
  • 原文地址:https://blog.csdn.net/niexinyu0026/article/details/128087603