day3-递归

定义

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

演示

def cal(n):  #定义函数
    print(n)  
    return cal(n)  #调用自己

cal(10)
#输出
10
10
。。。
File "C:/Users/Administrator/PycharmProjects/review20201128/day01.py", line 2, in cal
    print(n)
RecursionError: maximum recursion depth exceeded while calling a Python object

解析:可以看到程序调用后,出现报错,这是因为Python为了程序保护,只允许递归调用999次。

验证代码如下:

def cal(n):
    print(n)
    return cal(n+1)

cal(0)
#输出
0
。。。
997  File "C:/Users/Administrator/PycharmProjects/review20201128/day01.py", line 3, in cal
print(n)
RecursionError: maximum recursion depth exceeded while calling a Python object

Process finished with exit code 1

小结:这样的递归会让程序进入一个无限的死循环中,外面的程序还没有执行完,又开始执行里面的程序,一层套一层的往下执行。

根据以上图例,递归一定需要一个结束符来结束循环,否则将会引起系统崩溃。

下面我们来看另外一个例子

def cal(n):   #定义函数
    print(n)
    if int(n/2) > 0:  #加条件,如果n/2>0,执行下面语句
       return cal(int(n/2))
    print("->",n)

cal(10)
#输出
10
5
2
1
-> 1

解析:可以看到循环传入10参数后,当n>0时,循环结束。

总结

递归特性

1.必须有一个明确的结束条件;

2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少;

3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

posted @ 2017-07-31 21:57  Mr.hu  阅读(95)  评论(0)    收藏  举报