递归算法专题记录



前言

递归:直接或者间接的调用自身的一个函数
递归设计方法:
①找重复项 -> 一直重复执行的某一项(子问题)
②找重复中的变量 -> 一直在不断改变的变量
③设计出口 -> 递归的最终结束条件
学习方法策略:
①循环改成递归练习
②经典递归算法学习
③总结规律,指定自己的递归学习套路
④做高难度的题,找自己的感觉


提示:以下是本篇文章正文内容,下面题目主要采用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踢足球没有假动作

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值