递归:在函数内部,可以调用其他函数,如果一个函数在内部调用自己本身,这个函数就是递归函数。
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)