编程环境:python2
题目来源:数据结构(python语言描述) [美]Kenneth.A.Lambert 著
2.一个标准的科学实验是,抛球并且看它能够弹跳多高。一旦球的“弹跳性”已经确定了,这个比率值就会给出弹跳的指数。例如,如果球从10米高落下弹跳到6米高,这个索引就是0.6,并且球在一次弹跳之后总的运动距离就是16米。如果球继续弹跳,两次弹跳后的距离将会是:10米+6米+3.6米=19.6米。注意,每次后续的弹跳运动距离,都是到地板的距离加上这个距离的0.6倍,这个0.6倍就是球反弹回来的距离。编写一个程序,让用户输入球的一个初始高度以及允许球持续弹跳的次数。输出为球弹跳的总距离。
考虑使用while循环:
#coding:utf-8
h=float(raw_input('输入球的初始高度(m):'))
n=int(input('输入球的弹跳的最大次数:'))
i=0
sum=h
while i
sum=sum+h*0.6
h=h*0.6
i+=1
print '运动的总距离为:{0}'.format(sum)
除了循环方法以外,这里还可以使用递归的方法:
#coding:utf-8
def ball_bounce(h,n,sum=0):
if (n+1)!=0:
ball_bounce(h*0.6,n-1,sum=sum+h)
else:
print '运动的总距离为:{}'.format(sum)
h=float(raw_input('输入球的初始高度(m):'))
n=int(input('输入球的弹跳的最大次数:'))
ball_bounce(h,n)
假如采用递归方法,当递归999次以上时会栈溢出,而不排除输入n>998的情况所以我们尽量使其在递归999次前终止递归,假定考虑到当输出值两次递归差值<0.001时,我们认为递归趋于不变,以此作为输出条件之一。
#coding:utf-8
def ball_bounce(h,n,sum=0):
if (n+1)!=0 and h>0.001:
ball_bounce(h*0.6,n-1,sum=sum+h)
else:
print '运动的总距离为:{:.3f}'.format(sum)
h=float(raw_input('输入球的初始高度(m):'))
n=int(input('输入球的弹跳的最大次数:'))
ball_bounce(h,n)
节约时间所以我也不写太多了,佛系笔记,全靠悟性O O
坑1:什么时候用循环什么时候用递归
坑2:递归栈溢出问题
坑3:空间复杂度与时间复杂度问题,部分类似问题参考秦九韶算法可以优化复杂度。
ps:其中format是格式化输出问题,查阅相关资料。
有不对的地方望指证