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)

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值