文章目录
前言
递归:直接或者间接的调用自身的一个函数
递归设计方法:
①找重复项 -> 一直重复执行的某一项(子问题)
②找重复中的变量 -> 一直在不断改变的变量
③设计出口 -> 递归的最终结束条件
学习方法策略:
①循环改成递归练习
②经典递归算法学习
③总结规律,指定自己的递归学习套路
④做高难度的题,找自己的感觉
提示:以下是本篇文章正文内容,下面题目主要采用Python的语法进行书写
一、求阶乘?
阶乘问题(5!=5×4×3×2×1)def fac(n):
if n == 1:
return 1
return n*fac(n-1)
二、打印i-j?
传参传入i和j,输出i到j的数字def num(i,j):
if i>j:
return
print(i)
return num(i+1,j)
解析:
1、i>j就是阶乘的结束条件
2、重复执行项就是print(i)
3、return num(i+1,j)就是重复变量
三、数组求和?
传参传入一个数字类型的数组,然后计算出来这个数组的和def Get_ArrSum(Arr,n):
if n<0:
return 0
return Arr[n]+Get_ArrSum(Arr,n-1)
解析:
1、Arr是传入的数字数组
2、n是数组的长度
3、return Arr[n]+Get_ArrSum(Arr,n-1)就是重复变量
四、翻转字符串?
输入参数abcdefg,输出参数gfedcba,对输入的字符串进行翻转。def StrFlip(ArrStr, end):
if end == 0:
return ArrStr[0]
return ArrStr[end]+StrFlip(ArrStr,end-1)
# 测试
ArrStr = "abcdefg"
print(StrFlip(ArrStr,len(ArrStr)-1))
print(ArrStr)
五、求斐波那契数列前n项?对前n项求和?
斐波那契数列 1、1、2、3、5、8、13 .....def fib(n):
if n==1 or n==2:
return 1
return fib(n-1)+fib(n-2)
六、求最大公约数?△
欧几里得算法(辗转相除法。) 其基于的定理是:两个数的最大公约数等于较小的那个数和这两个数相除的余数的最大公约数。始终保持m中的数值是最大的基本思路:
假设这两个数是m和n,其中,m大于n,m%n的值是r,那么m和n的最大公约数等于n和r的最大公约数。所以我们为了求出两个数的最大公约数,就要先用m和n取模(余数),再用n和模取模……一直循环下去。直到模为0,那么最后一次的除数就是最大公约数。所以我们就找到了递归的基线条件:模为0.
def MaxFew(m,n):
if m < n:
m,n = n,m
if m%n == 0:
return n
else:
return MaxFew(n,m%n)
七、插入排序改递归?
插入排序改成递归算法
def InsertionSortRec(n, A): # 递归算法
if n > 1:
InsertionSortRec(n - 1, A)
x = A[n - 1]
j = n - 2
while j >= 0 and A[j] > x:
A[j + 1] = A[j]
j = j - 1
八、汉诺塔?
递归形式改成汉诺塔的问题def hanoi(n, a, b, c):
if n > 1:
hanoi(n - 1, a, c, b)
print("moving from %s to %s" % (a, c))
hanoi(n - 1, b, a, c)
基本思路:
九、 3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少??
这个也就类似于斐波那契数列的问题,根据斐波那契数列算即可。# 正常Python思路
a, b = 0, 1
for i in range(1, 13):
print('第%s个月:%s只兔子' % (i,b))
a, b = b, a+b
十、n阶台阶,一次走一步或两步,有多少种走法?
分析:
1、n=0 和 n=1 的时候 并没有其他可选择的,所以可以得出f(0)=0;f(1)=1;
2、n>=2时情况就变复杂起来,但是这个时候可以操作的步骤也就2种也就是走1步(n-1)与走2步(n-2)。所以可以得到f(n)=f(n-1)+f(n-2);
从当前状态转为下一状态的通用算法既可。
3、 验证,使用2以上的数字验证几次。
def findStep(n):
if n==0 or n==1 or n==2:
return n
return findStep(n-1) + findStep(n-2)
十一、递归二分查找算法
二分查找用递归的方式去实现def recBinSearch(x, nums, low, high):
if low > high:
return -1
mid = (low + high) / 2
item = nums[mid]
if item == x:
return mid
elif x < item:
return recBinSearch(x, nums, low, mid - 1)
else:
return recBinSearch(x, nums, mid + 1, high)
基本思路:
总结
pass