#函数参数
def power(x):
return x * x
print(power(10))
def power(x,n = 2):#n=2为设置的默认参数,默认参数应设置为不变量,如设置成可变量,则每次调用结束,如果该参数变了,下次调用也跟着变了
sum = 1
while(n>0):
sum = sum * x
n = n - 1
return sum
print(power(2,3))
print(power(2))
print(power(2,4))
#可变参数
def calc(*numbers):#numbers可以作为一个list或者tuple传进来
sum = 0
for n in numbers:
sum = sum + n
return sum
print(calc(1,2,3,4))
#关键字参数,关键字参数在函数内部自动组转为一个dict
def person(name, age, **other):
print('name:',name,'age:',age,'other:',other)
person('laizi',23,city = 'sichuang')
#命名关键字参数,限制关键字参数的名字,命名关键字参数必须传入参数名,这和位置参数不同
def person1(name, age, *, city, job):
print(name, age, city, job)
person1('Bob', 24, city = 'beijing',job = 'engineer')
'''
1:默认参数一定要用不可变对象
2:*args 是可变参数, args 接收的是一个 tuple, **kw 是关键字参数, kw 接收的是一个 dict。
'''
#递归函数:一个函数在内部调用自身本身。存在栈溢出风险
def jiecheng(n):
if n == 1:
return 1
return n * jiecheng(n-1)
print(jiecheng(4))
#尾递归解决栈溢出,在调用一次函数就得出想要的值,不用像上一个函数那样等待下次调用返回的值后在得到想要的值,从而将多个栈变为一个栈
def jiecheng1(n,product):
if n == 1:
return product
else:
product = n * product
n = n - 1
return jiecheng1(n,product)
print(jiecheng1(5,1))
#假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。。此后不难证明f(n)=2^n-1。n=64时,
def Tower_f_Hanoi(n):
if n == 1:
return 1
else:
n = n -1
return 2 * Tower_f_Hanoi(n) + 1
print(Tower_f_Hanoi(64))