赞
踩
首先,我们来讲一个故事:从前有座山,山里有座庙,庙里有个老和尚再给小和尚讲故事。
讲:"从前有座山,山里有座庙,庙里有个老和尚再给小和尚讲故事。"
讲:"从前有座山,山里有座庙,庙里有个老和尚再给小和尚讲故事。"。。。。。。
这可能是我们最早接触到的“递归函数”
- def calc(n):
- print(n)
- if int(n/2) ==0:
- return n
- return calc(int(n/2))
-
- calc(10)
-
- 输出:
- 10
- 5
- 2
- 1
函数calc先传进一个参数10经过函数体,在return是,把n/2返回calc中继续执行,知道n/2等于0截至。
这就是递归函数。递归函数主要用于解决数学难题。
在程序中,函数是存储在栈中,栈就好比弹壳,函数运行的数据就是弹药。在递归函数中,没递归一次,就好比在弹夹中压入一颗子弹。弹夹容量是有限制的,也就是说如果无限递归,早晚会撑爆弹夹。这也就是递归与栈的关系。
上代码:
- def calc(n):
- v=int(n/2)
- print(v)
- if v==0:
- return
- calc(v)
- print(v)
- calc(10)
为什么会有这个结果?
每递归一次,就会有一个新的函数在执行,然而在下一层函数没有执行完毕之前,上一层函数就无法关闭,但是在下一层函数中还会继续调用函数。也就是说,在递归中,最后一层函数没有执行完毕前,他所有上层函数都是处在执行的状态,当最后一层执行完毕后,会由里到外,一层层执行关闭,这也是为什么会出现上面运行结果的原因。
结合上述,我们来总结下递归的特性。
1.必须有一个判断条件来结束递归。
2.每递归一次,问题的规模都会比上一层递归有所减少,都会更接近我们的判断条件。
3.递归效率不高,多次递归可能导致栈溢出。
我们都知道return是函数结束的标志,所以以return返回函数的方法调用自己,可以在执行下一层函数的时候关闭当前函数。
不过这种return不能附带当前层参数的运算,比如return n*func(n-1)
因为在你调用下一层函数的时候,还要与当前层参数运算,下一层不结束,就不能返回值与当前层参数运算,所以当前层函数就要等待下一层返回值。也就不能关闭当前层函数。多了这么多,这种优化方式在python中不支持,所以。呵呵
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。