递归的学习

递归学习

递归三大要素
第一: 明确函数要干什么
第二: 寻找递归结束的条件
第三: 找出函数等价的关系式

递归求和

方法一
ls=[1,2,3,4,5]
def fun(ls,n):
    if n==0:
        return ls[n]
    else:
        s=fun(ls,n-1)
        return s+ls[n]
print(fun(ls,4))
方法二
def fun(ls,n):
    if n==len(ls):
        return 0
    else:
        sum=fun(ls,n+1)
        return sum+ls[n]
print(fun(ls,0))

递归判断字符串的内容是否相同

a="abcdef"
b="abcdef"
def fun(a,b):
    if len(a)==0:
        return True
    if len(a)!=len(b):
        return False
    if a[0]!=b[0]:
        return False
    else:
        return fun(a[1::],b[1::])
print(fun(a,b))
斐波那契数列

1、1、2、3、5、8、13、21、34

def fun(n):
	#递归退出条件, 当n是第一个数,或者第二个数, 返回1
    if n==1 or n==2:
        return 1
    else:
    	#第三个数就等于前两个数的和
        return fun(n-2)+fun(n-1)
求在m个球中, 一次性取n个球, 不放回有多少种取法
#在m个球中, 取n个,不放回,有多少中取法
def fun(m,n):
    #如果一次性取的球大于剩余的球, 则没有取法
    if m<n:
        return 0
    #如果相等, 则只有一种取法
    if m==n:
        return 1
    #如果n等于0, 则只要一种取法就是不取
    if n==0:
        return 1
    else:
        #想象m个球中有一个特殊球,取法划分,是否包含这个特殊球
        # fun(m-1,n-1)不包含+fun(m-1,n)包含的两种方式加起来, 就是一共多少种取法
        return fun(m-1,n-1)+fun(m-1,n)
print(fun(10,3))
求n个元素的全排列
def fun(s,k):
    if k==len(s):
        for i in s:
            print(i,end='')
        print()
    for i in range(k,len(s)):
        s[i],s[k]=s[k],s[i]
        fun(s,k+1)
        s[i], s[k] = s[k], s[i] #回溯
s="ABC"
ls=list(map(str,str(s)))
fun(ls,0)
求两个字符串的公共最长的公共子序列的长度
# abcd  bcd
s1=input().strip()
s2=input().strip()
def f(s1,s2):
    if len(s1)==0 or len(s2)==0:
        return 0
    if s1[0]==s2[0]:
        return f(s1[1::],s2[1::])+1
    else:
        return max(f(s1[1::],s2),f(s1,s2[1::]))
print(f(s1,s2))
使用递归将字符串反转
s1=input().strip()
def fun(s):
    if len(s)<=1:
        return s
    else:
        return fun(s[1::])+s[0]
print(fun(s1))
使用递归打印杨辉三角
def f(m,n):
    if n==0 or m==n:
        return 1
    else:
        return f(m-1,n)+f(m-1,n-1)
n=int(input().strip())
for i in range(n):
    for j in range(n-i-2,-1,-1):
        print(" ", end='')
    for j in range(i+1):
        print(f(i,j),end=' ')
    print()
m个A,n个B 可以组成多少组排列
def f(m,n):
    if m==0 or n==0:
        return 1
    else:
        return f(m-1,n)+f(m,n-1)
m,n=map(int,input().split())
print(f(m,n))
求最大公约数
def f(x,y):
    if x<0:
        x=-x
    if y<0:
        y=-y
    if y==0:
        return x
    return f(y,x%y)
  
#最大公约数 <辗转相除法>
a=15
b=60
while True:
    if a==0:
        print(b)
        break
    a,b=b%a,a
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值