admin管理员组

文章数量:1794759

python趣味编程——递归思想

python趣味编程——递归思想

在知乎上看到一个趣味编程,自己想了个方法,记录下来。

用python编程解决这个问题,想到的解决办法是:一层一层的加,直到柱子不能圈住雨水。实现起来就是递归思想。

直接上代码:

def getrainvolum(inputlist): templist=[] for ele in inputlist: if ele>=1: templist.append(1) else: templist.append(0) templist_str= "".join([str(x) for x in templist]).strip('0') count_list=[int(x) for x in templist_str] newinputlist = [] for i in range(len(inputlist)): newinputlist.append(inputlist[i]-templist[i]) rain_count=len(count_list)-sum(count_list) if len(newinputlist)==1 or sum(newinputlist)<=1: return rain_count else: return rain_count+getrainvolum(newinputlist) if __name__ == '__main__': input=[0,1,0,2,1,0,1,3,2,1,2,1] rain_sum=getrainvolum(input) print(rain_sum)

简单的测试的几组数据,貌似没有大的问题。

假如把柱子的高度可以是小数,那么该怎么解决呢?同样的还是采用递归,一层一层的加,只是这里的一层和上面柱子高度整数的时候,层的高度不一样。这里的层高都不一样。

def getrainvolum(inputlist): templist=[] sort_inputlist=sorted(inputlist,reverse=False) min_hright=0 for h in sort_inputlist: if h!=0: min_hright=h break for ele in inputlist: if ele!=0: templist.append(min_hright) else: templist.append(0) count_list=deletezerofirstlast(templist) newinputlist = [] for i in range(len(inputlist)): newinputlist.append(inputlist[i]-templist[i]) rain_count=len(count_list)*min_hright-sum(count_list) if islistelemthesmae(newinputlist)==2: return rain_count else: return rain_count+getrainvolum(newinputlist) def deletezerofirstlast(array): right=0 for a in array: if a==0.0: right+=1 else: break left=0 for a in array[::-1]: if a==0.0: left+=1 else: break print('left:',left) return array[right:len(array)-left] def islistelemthesmae(list): s=set(list) return len(s) if __name__ == '__main__': input=[0,0.9,0,2,1,0,1,2.5,2,1,2,1] rain_sum=getrainvolum(input) print(rain_sum)

记录的作用就是熟悉递归的思想和应用。

有其他更好的方法,反应告知,有错误的话也可以指出,谢谢!

本文标签: 递归趣味思想Python