递归是解决重复性问题的一种方法,其能够将一个问题不断的分成更小的问题,直到问题解决;通常情况下,递归就是一个不停调用自己的函数。
递归地实现即是函数的自调用:函数运行结束时返回到自身的调用中。逻辑上与循环类似
接下来是一个问题的递归解决思路,会一步步地进行优化完善
问:用两个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
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)
water=0
V=4
def common():
global water
water+=V
print(water)
if water==20: #增加判断语句,不然会一直调用自己
return water
else:
return common()
common()
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.必须是自己调用自己