赞
踩
来一个表情理解递归
下边我会详细介绍下这个代码
def fun(res, num, sb: str): if len(num) == 1: for i in range(len(num)): a = num[i] b = num[:] b.pop(i) operate = str(a) sb = sb + operate if eval(sb) == res: print(sb + "=" + str(res)) return True else: return False for i in range(len(num)): a = num[i] b = num[:] b.pop(i) operate = str(a) sb = sb + operate fun(res, b, sb + '+') fun(res, b, sb + '-') fun(res, b, sb + '*') fun(res, b, sb + '/') return "True" num = [1, 2, 3, 4, 5, 6, 7, 8, 9] result = fun(100, num, '')
这是1-9加减乘除运算的100的算法。
里边的几个用到语法,我会在下边注解一下。源代码在下边我会复制上去。
这里用的是list列表。
从开始result调用定义的fun函数传入100,num,‘ ’这几个参数,(100就是我们要等于的数字100,如果你要是等于1000也可以等于1000)。
这时函数传参给fun()res就等于了100,num的列表页传数值也传到里边了,这里要说一下,sb传的是str类型的值,
接下来判断num的长度,len(num)就是测的num的长度的py函数
这个的作用就是为了组合出1+2+3+4+5+6+7+8+9这个式子,这里会嵌套八次,记住这里。建议这里将代码复制一份去debug一下看看,这样比较明白。
因为if不成立所以他会执行的是for循环这里边的num[:]的作用就是复制一份num的地址,相当于重新写了一个数组赋值了一份num里边的数据,b.pop(i)用法是将b中的某一个元素删掉我贴一个解释代码你就明白了
list1 = [‘Google’, ‘Runoob’, ‘Taobao’]
list_pop=list1.pop(1)
print “删除的项为 :”, list_pop
print "列表现在为 : ", list1
以上实例输出结果如下:
删除的项为 : Runoob
列表现在为 : [‘Google’, ‘Taobao’]
str(a)转化字符
sb = sb+operate就是在组装算式,然后再调用fun()将新的参数传到方法里边,注意这里是在嵌套,既然嵌套了就还要回调(我也不知道是不是叫回调,反正就是还要退出来你调用的东西,你调用了几次就要在退出来几次,这里我贴一个入门的代码,建议自己多debug几次领悟一下)
def age(n):
if n == 1:
return 18
else:
return age(n-1) + 2
print(age(4))
当for循环结束后这才正式进入递归的算法,当num里边只剩一个数字时len(num)就等于了1,这是进入if条件,进去之后运行的代码我上边都说过了这里我会说一下重点来了,我就是因为这个地方写了这篇博客,希望能彻底理解递归算法。
这里第二个if会判断下这个式子等于100,if里边的eval函数是用来列表的字符串转化为可以运算的式子并且判断下他等于不等于100,如果等于就print出这个式子,如果不等于,就return turn,这里return turn的作用单纯是要结束这次的嵌套而已,没用什么实质的作用(实质作用是指如果返回turn就怎么样,如果返回false就怎么,因为return的基本就是可以结束一个程序,相信小伙伴们学c还记得return 0;吧就是这个意思)。
接下来,因为1+2+3+4+5+6+7+8+9这个是自己的结果是不等于100的,所以return之后会结束这次的递归调(调用的+9),而继续运行下一条的调用(-9),在判断下1+2+3+4+5+6+7+8-9是不是等于100,不是在结束这次的调用,运行下边九的调用,再是/9的调用。这样最里边的一次调用就完成了
接下来就是换成-8的调用了,这里说一下,大家还记得这个1+2+3+4+5+6+7+8+9是一层层的调用吗,其实本质上就是调用的嵌套,因为+8的那层已经都试完了,所以+8的那层函数就结束了
和+9换成-9一样,这时+8换成-8,这时num里有成了两个数字所以又会运行一次加减乘除9的运算,这样以此类推下去,回把所有的情况尝试一遍,一共是4^8次的尝试。最后的运行结果可能会因为你的±/不一样而不同。因为这里的代码没有考虑数学的运算的优先级。好了,本次代码就解释到这里吧,可能不是很明白,但是已经是我的个人所有经验了
ps:这次的代码也可以改成那种中间没有运算符的比如1234+5+6+7+8-9这个只需要吧符号改成空的就好。
还有就是我们可能需要c里边那种switch——case语句这里我也写了一份借供参考
def switch_case(value):
switcher = {
0: "zero",
1: "one",
2: "two",
}
return switcher.get(value, 'wrong value')
上面的代码等价于switch语句,即传入的参数如果是字典的索引键值,就可以得到相应的得到字典的值,如果没有匹配到相应的字典键值,就得到默认值(这里是
‘wrong value’)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。