递归:在函数内部,可以调用其他函数,如果一个函数在内部调用自己本身,这个函数就是递归函数。
def calc(z): # 定义一个函数 s = int(z/2) # 计算传入的值除以2 print(s) # 打印计算结果 if s > 0: # 判断计算结果是否大于0 calc(s) # 如果计算结果大于0将结果传入再次调用函数 print(z) # 当结果小于零时打印传入的参数z calc(10)
输出的结果是:5 2 1 0 1 2 5 10
在python的递归函数,每调用一次自己,上一次调用会存到一个栈里,知道符合结束条件,在依次退回上一级结束函数。
递归的特性:
必须有一个明确的结束条件
每进入更深一层递归时,问题规模相比上一次递归都应有所减少
递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,
栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧.由于栈的大小不是无限的,所以,递归调用的次数过多会导致栈溢出。
写一个计算计算阶层的例子:
def factorial(n): if n == 1: return 1 return n * factorial(n-1) s = factorial(10) print(s)
二分运算
如果规定某一科目成绩分数范围:[0,100],现在小明知道自己的成绩,他让你猜他的成绩,如果猜的高了或者低了都会告诉你,用最少的次数猜出他的成绩,你会如何设定方案?
def guess_mark(n, high, low): mid = int((high +low)/2) if mid < n: print(mid, "猜低了") return guess_mark(n, high, mid) elif mid > n: print(mid, "猜高了") return guess_mark(n, mid, low) else: return mid, "猜对了" t = guess_mark(18, len(data), 0) print(t)