递归!递归!

递归是解决重复性问题的一种方法,其能够将一个问题不断的分成更小的问题,直到问题解决;通常情况下,递归就是一个不停调用自己的函数。

递归地实现即是函数的自调用:函数运行结束时返回到自身的调用中。逻辑上与循环类似

接下来是一个问题的递归解决思路,会一步步地进行优化完善

题目一

问:用两个2L的水壶装水,装满一个20L的水缸,需要几次才能装满

思路分析:

水壶2L,每次能挑4L

第一次,挑来4L,水缸0+4

第二次,挑来4L,水缸0+4+4

第三次,挑来4L,水缸0+4+4+4

第四次,挑来4L,水缸0+4+4+4+4

第五次,挑来4L,水缸0+4+4+4+4+4

1.调用函数

water=0
V=4
def first():
    return water+4
def second():
    return first()+4
def third():
    return second() + 4
def forth():
    return third() + 4
def fifth():
    return forth()+4
res=fifth()
print(res)

2.递归

water=0
V=4
def common():
    global water 
    water+=V
    print(water)
    if water==20:   #增加判断语句,不然会一直调用自己
        return water
    else:
        return common()
common()

3.带有传参的递归

water=0
v=4
def common(water):
    if water>=20:
        print(water)
        return water
    else:
        return common(water+v)
common(water)

在water没有大于等于20之前,会通过判断语句不断的调用函数common(water+v),直到=20的时候return water,输出了结果。

题目二

问:计算某个列表中的数字之和

思路:例如[1,2,3,4,5]

1 [2,3,4,5] 每次将列表中的用第一个元素拿了出来进行相加

1+2 [3,4,5]

1+2+3 [4,5]

1+2+3+4 [5]

1+2+3+4+5 []

lst=[i for i in range(1,11)]
def sum_lst(lst):
    if len(lst)==1:
        return lst[0]
    else:
        return lst[0]+sum_lst(lst[1:])  对lst进行切片,在lst的第一个元素被相加后就不要了,将其后面的元素切片出来继续调用
sum=sum_lst(lst)
print(sum)

数字和函数明显是不能想加的,于是后面的函数就会一直调用,直到最后的变成数字。


第一次:1+sum_lst(lst[1:])                #lst=[1,2,3,4,5,6,7,8,9,10]

第二次:1+2+sum_lst(lst[1:])#lst=[2,3,4,5,6,7,8,9,10]

第三次:1+2+3+sum_lst(lst[1:])))       #lst=[3,4,5,6,7,8,9,10]

第四次:1+2+3+4+sum_lst(lst[1:]))))    #lst=[4,5,6,7,8,9,10]

…………

第九次:1+2+3+4+5+6+7+8+9+10))))))))) #lst=[10]

反思:

在这两个题中,通过递归的方法来实现对自身的调用,直到达到符合的结果时通过判断语句结束调用,然后再输出结果。

在第二题理解过程中我还是习惯性的将return理解成了print,习惯性的认为结果就是要输出lst[0]。在理解的时候还百思不得其解,认为代码错了。第二题实质上只是lst[0]和sum_lst(lst[1:])的加法,因为函数还没有调用完,于是就出现了等效于循环的效果,直到函数被调用完。

而且最后的输出结果应该是10+9+8+7+……+1。我们都直到运算法则,应该是小括号内的优先,所以会是这样的倒序。

总结:

1.必须有一个停止条件
2.状态必须要改变,并且像停止条件趋近
3.必须是自己调用自己

你可能感兴趣的:(Python,python,开发语言)