教你什么是递归(python实现)

递归

递归:自己调用自己

下面我们通过实现从1加到100来理解递归。
从1加到100一般我们采用循环实现。

sum = 0
for i in range(1,101):
    sum += i
print(sum)
sum = 0

如果用递归实现
那么就是

def sum1(max):
    if max <= 100 and max >=0:    #递归条件
        return max + sum1(max - 1)
    else:
        return 0
print(sum1(100))

将1加到100,是将问题拆分为,[1…99]+100,同时[1…99]可以拆分为[1…98]+99,这样不断地拆分下去,直到变为[1]+2,最后再将这些数加起来。
这里同时涉及到递归地基线条件和递归条件。

基线条件和递归条件

递归是自己调用自己,当没有结束条件时,便会无线调用自己,死循环。
如下面这个程序

def countdown(i):
    print(i)
    countdown(i-1)

countdown(3)

本意是想要打印3到0停止,而因为没有设置停止条件,导致无线循环,从而程序停止。
最终提示错误信息

RecursionError: maximum recursion depth exceeded while calling a Python object

基线条件

故基线条件就是递归停止的条件。

那么,这里我们需要到达0停止,则程序修改如下:

def countdown(i):
    print(i)
    if i <= 1: #基线条件
        return
    else:
        countdown(i-1)
    
countdown(3)

结果:
在这里插入图片描述

递归条件

而递归条件便是,每次需要改变的最小值。

如这里将代码改为

def countdown(i):
    print(i)
    if i <= 1:
        return
    else:
        countdown(i-2) #递归条件为其值-2,不再是-1
    
countdown(9)

结果如下:
在这里插入图片描述

栈就是一个箱子,东西放进去以后,若要拿出最下面的东西,只有把上面的东西拿出来才能拿出最下面的东西。是一个先进后出的结构

def greet(name):
    print("hello," + name + "!")
    greet2(name)
    print("getting ready to say bye ...")
    bye()

def greet2(name):
    print("how are you," + name + "?")
def bye():
    print("ok,bye!")
    
    
greet("haobo")

最开始,栈为空,调用greet函数,那么greet函数进栈。
在这里插入图片描述
开始执行,先print打印(在python中print也是一个函数,这里方便理解,省略其进栈过程。)
在greet执行过程中,调用了greet2函数,故greet2进栈。
在这里插入图片描述
执行greet2后,出栈,greet继续执行,执行print后,再调用bey函数进栈执行。
在这里插入图片描述
最后执行完成后,栈为空。
执行结果如下:相信你能理解!
在这里插入图片描述
下面再用一个递归求阶乘的例子让你更加能够理解把。

def fact(x):
    if x == 1:
        return 1
    else:
        return x * fact(x-1)
                
print(fact(10))

将109…1>>10(91)>>10(9*(8*…1))最终变为10(9*(8*…*(1 )…)的样子。

猜你喜欢

转载自blog.csdn.net/qq_42707739/article/details/105195145
今日推荐