递归函数其实不是编程里面所定义的函数,而是数学里面的递归,传递的是一种规律,所以叫递归函数;
我们写递归函数,其实就是三点:第一肯定是一个有规律的运算,所以才会不停的调用同一个函数,第二是有一个传递的过程,从最后一直往前推,并且一直在调用函数自己,第三是有一个回归的过程,在最后得到值得时候,就会告诉前面的一个,又不停的往回传递,最后得出结果:
举例:求N得阶乘:
def factorial(n):
#最后1的阶乘肯定是1是我们知道的值,所以就往回传递
if n==1:
return 1
#我们不知道n的阶乘是多少,只知道n的阶乘是n乘n-1的阶乘,所以就往下传递,阶乘的运算规律是一样的,所以不停调用本身
return n*factorial(n-1) print(factorial(10))
函数的作用域:其实就是指我们定义了一个变量,那这个变量的使用范围是多大;
python里面一般就是四种函数作用域:即LEGB;
L:loca,即在函数内部定义的变量,只在函数内部有用;
E:enclosing,即闭包函数,也就是外函数定义的变量,在整个闭包函数内有用;
G:global,全局命名空间,也就是在整个文件都有效;
B:builtin,内建,就是所有文件,模块都有效,只要是python就有效;
当程序在查找一个变量的时候,遵循的是从小到大原则,即先小范围,在大范围,即LEGB查找;
需要注意一点是,python没有块级作用域,这点和java有区别,java的话,是有块级作用域的;块级作用域的意思就是在代码块中,比如if while等语句的代码块;python是不分块级作用域的;
局部变量:指的就是函数内部的变量,可以用locals得到所有的局部变量,注意locas必须执行在局部函数体里面;另外之前也讲过一个地方,就是闭包的时候,有个关键字nonlocal,表明这个变量属于闭包函数区间,即E;
全局变量:指的是在函数外部,文件最外层定义的变量,可以用globals得到所有的全局变量,然后如果函数体内部的一个变量也想让他区间变成全局变量,则加一个关键字:global就会表面这个变量属于global区间;