通过python 初识递归

递归

  1. 函数调用自身,这个函数就是递归函数
  2. 递归经验:
    • 找边界——要有结束条件
    • 找变化——可变参数
    • 找重复——子问题

题目

计算正整数的阶乘

用递归方法一:

def f(n):
    if n == 1:
        return 1
    return f(n-1)*n
x = int(input())
print(f(x))

用递归方法二

def f(n):
    global s
    if n==1:
        return 
    s *= n
    return f(n-1)
n = int(input())
s = 1
f(n)
print(s)

用循环

x = int(input())
ans = 1
for i in range(1,n+1):
	ans *= i
print(ans)

用内置函数

import math
x = int(input())
print(math.factorial(n))

打印杨辉三角

在这里插入图片描述
用递归:

def f(i,j):
    if j==0 or i==j:
        return 1
    return f(i-1,j) + f(i-1,j-1)
for i in range(7):
    for k in range(7-i):
        print(' ',end='')
    for j in range(i+1):
        print(f(i,j),end=' ')
    print()

用循环:

a = [[0]*(i+2) for i in range(7)]
# i+2是多一列,为最后一个1计算出来作准备
for i in range(7):
    for k in range(7-i):
        print(' ',end='')
    for j in range(i+1):
        if j == 0:
            a[i][j]=1
        else:
            a[i][j] = a[i-1][j-1]+a[i-1][j]
        print(a[i][j], end=' ')
    print()

切香肠问题

题目链接
代码如下

def cut(n, k):
    if n == 0: 
        return 0
    if n >= k:
        return cut(n % k, k)
    return cut(n, k - n) + n
 
a, b = map(int, input().split())
print(cut(a, b))

放苹果问题

题目链接
可参考这篇文章所讲
方法一代码

def f(m,n):
    if m<n:
        return 0
    elif m==n:
        return 1
    else:
        s = 0
        for j in range(1,n+1):
            s+=f(m-n,j)
        return s
while 1:
    try:
        m,n = map(int,input().split())
        ans = 0
        for i in range(1,n+1):
            ans += f(m,i)
        print(ans)
    except:
        break

方法二

def ways(m, n):
    if m == 0 or n == 1:
        return 1
    elif n == 0:
        return 0
    elif m < n:
        return ways(m, m)
    else:
        return ways(m - n, n) + ways(m, n - 1)

while 1:
    try:
            m, n = map(int,input().split())
    except:
        break
    ans = ways(m, n)
    print(ans)

进一步优化代码如下

def ways(m,n):
    if m<0:
        return 0
    elif m==0 or n == 1:
        return 1
    return ways(m,n-1)+ways(m-n,n)
while 1:
    try:
        m,n = map(int,input().split())
        print(ways(m,n))
    except:
        break
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

peanut666888

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

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

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

打赏作者

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

抵扣说明:

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

余额充值