小伙伴关心的问题:python中n&1==n%2(python中计算1+2+…n),本文通过数据整理汇集了python中n&1==n%2(python中计算1+2+…n)相关信息,下面一起看看。

python中n&1==n%2(python中计算1+2+…n)

转载自

@Fireman A 如何理解汉诺塔递归?

对递归的理解的要点主要在于放弃!

放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件。

想象你来到某个热带丛林,意外发现了十层之高的汉诺塔。正当你苦苦思索如何搬动它时,林中出来一个土著,毛遂自荐要帮你搬塔。他名叫二傻,戴着一个草帽,草帽上有一个2字,号称会把一到二号盘搬到任意柱。

你灵机一动,问道:“你该不会有个兄弟叫三傻吧?”

“对对,老爷你咋知道的?他会搬一到三号盘。“

”那你去把他叫来,我不需要你了。“

于是三傻来了,他也带着个草帽,上面有个3字。

你说:”三傻,你帮我把头三个盘子移到c柱吧。“

三傻沉吟了一会,走进树林,你听见他大叫:”二傻,出来帮我把头两个盘子搬到C!“

由于天气炎热你开始打瞌睡。朦胧中你没看见二傻是怎么工作的,二傻干完以后,走入林中大叫一声:“老三, *** 完了!”

三傻出来,把三号盘从A搬到B,然后又去叫二傻:“老二,帮我把头两个盘子搬回A!”

余下的我就不多说了,总之三傻其实只搬三号盘,其他叫二傻出来干。最后一步是三傻把三号盘搬到C,然后呼叫二傻来把头两个盘子搬回C

事情完了之后你把三傻叫来,对他说:“其实你不知道怎么具体一步一步把三个盘子搬到C,是吧?”

三傻不解地说:“我不是把任务干完了?”

你说:“可你其实叫你兄弟二傻干了大部分工作呀?”

三傻说:“我外包给他和你屁相干?”

你问到:“二傻是不是也外包给了谁?“

三傻笑了:“这跟我有屁相干?”

你苦苦思索了一夜,第二天,你走入林中大叫:“十傻,你在哪?”

一个头上带着10号草帽的人,十傻,应声而出:“老爷,你有什么事?”

“我要你帮把1到10号盘子搬到C柱“

“好的,老爷。“十傻转身就向林内走。

“慢着,你该不是回去叫你兄弟九傻吧“

“老爷你怎么知道的?“

“所以你使唤他把头九个盘子搬过来搬过去,你只要搬几次十号盘就好了,对吗?“

“对呀!“

“你知不知道他是怎么干的?“

“这和我有屁相干?“

你叹了一口气,决定放弃。十傻开始干活。树林里充满了此起彼伏的叫声:“九傻,来一下!“ “老八,到你了!““五傻!。。。“”三傻!。。。“”大傻!“

你注意到大傻从不叫人,但是大傻的工作也最简单,他只是把一号盘搬来搬去。

若干年后,工作结束了。十傻来到你面前。你问十傻:“是谁教给你们这么干活的?“

十傻说:“我爸爸。他给我留了这张纸条。”

他从口袋里掏出一张小纸条,上面写着:“照你帽子的号码搬盘子到目标柱。如果有盘子压住你,叫你上面一位哥哥把他搬走。如果有盘子占住你要去的柱子,叫你哥哥把它搬到不碍事的地方。等你的盘子搬到了目标,叫你哥哥把该压在你上面的盘子搬回到你上头。“

你不解地问:“那大傻没有哥哥怎么办?“

十傻笑了:“他只管一号盘,所以永远不会碰到那两个‘如果’,也没有盘子该压在一号上啊。”

但这时他忽然变了颜色,好像泄漏了巨大的机密。他惊慌地看了你一眼,飞快地逃入树林。

第二天,你到树林里去搜寻这十兄弟。他们已经不知去向。你找到了一个小屋,只容一个人居住,但是屋里有十顶草帽,写着一到十号的号码

如果不想放弃,用数学归纳法可推导公式,证明可解汉诺塔问题:

假设圆盘的个数为n,圆盘编号从上到下依次为1,2,3,4,……n,证明如下

①当 n = 1 时,从 A 移动到 C 显然能够完成,设需要移动的次数是a1。

②当 n = 2 时,由①可知从把 1 号盘子从 A 移动到 B能够完成(B 和 C 是等效的)此时移动次数为a1。

之后把2号盘子移动到C上面此时移动次数为a1 + 1。

这时把1号盘子从B移动到C和①是等价的,

移动后总的移动次数是a2 = a1 + 1 + a1。

③当n = 3时,由②可知移动成下图的效果是可以实现的,

此时移动的次数是a2,接着把3号盘子移动到C上面

此时移动的次数是a2 + 1,这时把1和2号盘子移动到C上面(移动过程中3号盘子始终不会动)和②等效的,移动完成之后如下

移动的总次数是a3 = a2 + 1 + a2

④当n=4时,由③可知移动成下图的效果是可以实现的,

此时移动的次数是a3

把4号盘子从A移动到C

此时移动的次数是a3 + 1

接下来把123号盘子从B移动到C的过程又和③等效了移动之后如下

移动的总次数是a4 = a3 + 1 + a3

假设当n= k时,从A移动到C是可以实现的,那么当n=k+1时,可以移动到A上面只剩k+1号盘子,B上面依次是1,2,3,.....,k号盘字,此时移动次数是ak

把k+1号盘子移动到C上面,这时移动次数是ak + 1

接下来和n=k时移动过程等效,移动完成后移动总次数是ak+1 = ak + 1+ ak

可以得知移动k+1个盘子需要的次数与移动k个盘子的次数之间的关系是:

ak+1 = ak + 1+ ak = 2ak + 1

所以ak+1 + 1 = 2*(ak + 1)【这是个等比数列高中学过的】

即ak + 1 = (a1 +1)* 2n-1 = 2n 因此ak = 2n - 1

至此,证明完毕。

更多python中n&1==n%2(python中计算1+2+…n)相关信息请关注本站,本文仅仅做为展示!