迭代程序:
1 状态变量:
迭代次数
i
目前的计算结果
(状态变量都会有初始值)
2 状态变量的更新:
i=i−1
,直到
i=0
时停止
result=f(result)
例:用加法迭代计算乘法
def multi(x,p):
ans=0
while p>0:
ans+=x
p-=1
return(ans)
递归
递归的两个步骤:
例:用递归思想做乘法
def multi(a,b):
if b==1:
return a
else:
return a+multi(a,b-1)
每次调用递归都会创建一个新的环境,包含新的局部变量
当最后一次递归实现后,会一步一步代回被调用的地方
递归的数学思想:数学归纳法
大脑中验证递归程序也应当用数学归纳法,而不要返回去用迭代来验证,只会陷入死循环
例:求阶乘
def step(n):
if n==1:
return n
else:
return n*step(n-1)
例:汉诺塔问题
def printMove(fr,to):
print('Move from '+str(fr)+' to '+str(to))
def Towers(n,fr,to,spare):
if n==1:
printMove(fr,to)
else:
Towers(n-1,fr,spare,to)
Towers(1,fr,to,spare)
Towers(n-1,spare,to,fr)
例:斐波那契数列
def fib(x):
assert type(x)==int and x>=0
if x==0 or x==1:
return 1
else:
return fib(x-1)+fib(x-2)
assert函数检查输入是否符合假设,符合则执行函数体,否则结束并报错
例:回文判定
def isPalindrome(s):
def toChare(s):
s=s.lower()
ans=''
for c in s:
if c in 'abcdefghijklmnopqrstuvwxyz':
ans+=c
return ans
def isPal(s):
if len(s)<=1:
return True
else:
return s[0]==s[-1] and isPal(s[1:-1])
return isPal(toChare(s))
例:对求斐波那契数列的递归程序求递归次数
def fibMetered(x):
global numCalls
numCalls+=1
if x==0 or x==1:
return 1
else:
return fibMetered(x-1)+fibMetered(x-2)
def testFib(n):
for i in range(n+1):
global numCalls
numCalls=0
print('fib of '+str(i)+'='+str(fibMetered(i)))
print('fib called '+str(numCalls)+'times')
对于全局变量,应当小心使用,它会破坏程序的局部封装,从而更容易引入一些Bug。