递归函数:
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
例:
def calc(n): print(n) if int(n/2) ==0: return n return calc(int(n/2)) calc(10)
案例:二分查找
def BinarySearch(1,key): low = 0 high = len(1)-1 i = 0 while (low <= high) i = i+1 mid = (high + low)/2 if (1[mid] < key): low = mid + 1 elif (1[mid] > key): high = mid - 1 else: print('use %d time(s)' % i) return mid return -1
递归特性:
必须有一个明确的结束条件每次进入更深一层递归时,问题规模相比上次递归都应有所减少递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)。
递归的作用:
递归做为一种算法在程序设计语言中广泛应用.是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.
递归是一个函数在其定义中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
注意:
(1) 递归就是在过程或函数里调用自身;
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
递归算法一般用于解决三类问题:
(1)数据的定义是按递归定义的。(Fibonacci函数)
(2)问题解法按递归算法实现。(回溯)
(3)数据的结构形式是按递归定义的。(树的遍历,图的搜索)
嵌套函数:
name = "yue" def change_name(): name = "yueyue" def change_name2(): name = "yueyueyue" print("打印",name) change_name2() #调用内层函数 print("打印",name) change_name() print("打印",name)
这个就叫做嵌套调用,它是一个语言提供的程序设计的方法,也就是语言的特性。