1、编程求组合程序调用函数comb();comb()在执行过程中又调用了函数fac()。fac()的调用被嵌套在函数comb()的调用中。
n = eval(input("Input n: ")) m = eval(input("Input m: ")) def fac(k) : i = f = 1 while i<=k : f = f*i i = i+1 return f def comb(n, m) : c = fac(m)//(fac(n)*fac(m-n)) return c print(comb(n, m))
2、请改正下面程序中存在的错误?
def Sum(a,b,c):
print(a+b+c)
t=(1,2,3)
Sum(**t) 改为:Sum(*t)
3、请定义一个函数q(a, b, c),接收3个参数,可以使用全局变量__name__,进行测试,返回一元二次方程:ax2 + bx + c = 0的两个解。提示:计算平方根可以调用math.sqrt()函数。
import math def q(a, b, c): if a == 0: print('函数无解。') else: dert = b * b - 4 * a * c x1 = (- b + math.sqrt ( dert )) / ( 2 * a ) x2 = (- b - math.sqrt ( dert )) / ( 2 * a ) return x1,x2 if __name__ == '__main__': print ( 'q(2, 3, 1) =' , q ( 2 , 3 , 1 ) ) print ( 'q(1, 3, -4) =' , q ( 1 , 3 , -4 ) ) if q ( 2 , 3 , 1 ) != (-0.5 , -1.0): print ( '测试失败' ) elif q ( 1 , 3 , -4 ) != (1.0 , -4.0): print ( '测试失败' ) else: print ( '测试成功' )
4、编写程序解决汉诺塔问题:有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置n个盘子(编号从n至1,即最下面盘子编号为n,最上面盘子编号为1)。目标:把A杆上的盘子全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。提示:编写递归函数解决该问题。
我们可以理解move(n,a,b,c)函数中对应的a表示起始位置,b表示中间位置,c表示最终要移到的位置,可以分为下面3个部分理解:
1.将n-1个盘子从a移到b
2.将最后1个盘子从a移到c
3.将n-1个盘子从b移到c
def move (n,a,b,c): if n ==1: print('move',a,'-->',c) else: move(n-1,a,c,b) #把上面n-1个从a-->b move(1,a,b,c) #把最下面一个从a-->c move(n-1,b,a,c) #把上面n-1个从b-->c n=float(input('请输入n=')) print('结果如下所示:') print(move(n,'A','B','C'))
第二种:
step=0 def move(n,a,b,c): global step if n==1: #这个地方就是递归函数调用终止的条件 print(a,'-->',c) step=step+1 else: move(n-1,a,c,b) #把上面n-1个从a-->b move(1,a,b,c) #把最下面一个从a-->c move(n-1,b,a,c) #把上面n-1个从b-->c def main(): n=eval(input("please input the numbers of the plates:")) move(n,'A','B','C') #这里的A B C 表示圆柱 print("the total steps to move the plates from a to c is {}".format(step)) main()