递归
定义
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
条件
边界条件:判断递归何时结束
递归前进段:边界条件不满足时,递归前进(每次递归需要做的工作)
递归返回段:当边界条件满足时,递归返回。(需要有结果)
递归应用
递归算法一般用于解决三类问题:
- 数据的定义是按递归定义的。(Fibonacci函数、阶乘)
- 问题解法按递归算法实现。(汉诺塔游戏)
这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单. - 数据的结构形式是按递归定义的。(树、链表的遍历)
如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归地描述。
经典例子
斐波那契数列的排列是:0,1,1,2,3,5,8,13,21,34,55,89,144……依次类推下去,你会发现,它后一个数等于前面两个数的和。在这个数列中的数字,就被称为斐波那契数。
递归思想:一个数等于前两个数的和。(这并不是废话,这是执行思路)
首先分析数列的递归表达式:
f ( n ) = { n n<=1 f ( n − 1 ) + f ( n − 2 ) n>1 f(n) = \begin{cases} n &\text{n<=1} \\ f(n-1)+f(n-2) &\text{n>1} \end{cases} f(n)={nf(n−1)+f(n−2)n<=1n>1
def fib(x):
if x<2:
return 0 if x==0 else 1
#当x>2时,开始递归调用fib()函数:
return fib(x-1) +fib(x-2)
print(fib(6)) # 打印结果为:8
题目
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
分析
每次中间分两份,左右求一半的值,然后左右据需划分,用递归最简单,但是需要注意两点:(1)n 的正负号,(2)在进行二分的时候,判断是否能被2整除,就是奇偶性。
代码
class Solution:
def myPow(self, x, n):
"""
:type x: float
:type n: int
:rtype: float
"""
if(n==0):
return 1.0
if(n<0):
x= 1/x
n = abs(n)
x1= x*x
return self.myPow(x1,n//2) if (n%2==0) else x*self.myPow(x1,n//2)