本系列内容来自何韬编著的《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)
第4行: 1*4=4 2*4=8 3*4=12 4*4=16
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行: 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
这样的问题是在一开始多了一个空行,如果要坚持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行: 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