递归函数的使用
什么是递归函数
递归算法是一种直接或者间接调用自身函数或者方法的算法。递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。递归算法,其实说白了,就是程序的自身调用。它表现在一段程序中往往会遇到调用自身的那样一种coding策略,这样我们就可以利用大道至简的思想,把一个大的复杂的问题层层转换为一个小的和原问题相似的问题来求解的这样一种策略。
使用递归函数遵守的原则
+ 循环调用函数本身
+ 每次调用规模次数都有所减少(通常减半)
+ 前一次的输出作为后一次的输入
+ 必须包含一个基线条件(必须存在出口,防止死循环)
使用递归函数的步骤
+ 先考虑递归函数的基线是什么,将基线作为函数的出口,定义好逻辑框架
if xxx:
return #结束 (必须包含一个基线条件)
else XXX:
return #继续调用递归处理逻辑 (循环调用函数本身,每次调用规模次数都有所减少)
- return 处理逻辑时,需要调用函数本身,进行逻辑处理
可用于递归函数的算法
+ 阶乘运算
+ 二分查找
+ 斐波那契算法(兔子算法)
+ 汉诺塔
递归函数参考代码
# 阶乘运算
int factorial(int n){
if(n == 1)
return 1;
else
return n * factorial(n - 1);
}
# 使用递归实现二分查找
def binary_search(lis, left, right, num):
if left > right: #递归结束条件
return -1
mid = (left + right) // 2
if num < lis[mid]:
right = mid -1
elif num > lis[mid]:
left = mid + 1
else:
return mid
return binary_search(lis, left, right, num)
#这里之所以会有return是因为必须要接收值,不然返回None
#回溯到最后一层的时候,如果没有return,那么将会返回None
list_item = [1,3,5,7,9,23,43,57,58,60,76,89,100]
index = binary_search(list_item,0,len(list_item)-1,2)
print("{0},{1}".format(index,list_item[index]))
# 斐波纳契数列
int Fibonacci(int n){
if (n <= 1)
return n;
else
return Fibonacci(n-1) + Fibonacci(n-2);
}
# 汉诺塔
void Hanoi (int n, char A, char B, char C){
if (n==1){ //end condition
move(A,B);//‘move’ can be defined to be a print function
}
else{
Hanoi(n-1,A,C,B);//move sub [n-1] pans from A to B
move(A,C);//move the bottom(max) pan to C
Hanoi(n-1,B,A,C);//move sub [n-1] pans from B to C
}
}