洛谷 官方题库 python 第五天

递归和递推

P1255 数楼梯

N=int(input())
def climbStairs(n):
    if n == 1:
        return 1
    elif n == 2:
        return 2
    else:
        return climbStairs(n - 1) + climbStairs(n - 2)
print(climbStairs(N))

这里用到了

斐波那契数列是一个非常经典的数学问题,它是一个无限序列,起始于0和1,后续的每个数字都是前两个数字之和。因此,斐波那契数列的前几个数字是0, 1, 1, 2, 3, 5, 8, 13, 21, 34等等。

斐波那契数列常见的表达式是:

F(n)=F(n−1)+F(n−2)

其中 F(0)=0, F(1)=1。

假设我们要爬n阶楼梯,每次可以爬1阶或2阶。为了到达第n阶楼梯,我们可以从第n-1阶楼梯爬1阶上去,或者从第n-2阶楼梯爬2阶上去。因此,到达第n阶楼梯的方法数等于到达第n-1阶楼梯的方法数与到达第n-2阶楼梯的方法数之和。

这正好是斐波那契数列的递推关系。当楼梯阶数为1时,只有一种爬法(爬1阶),当楼梯阶数为2时,有两种爬法(爬1阶两次或者爬2阶一次)。而对于更高的阶数,就可以根据上述的递推关系依次计算出不同阶数的爬法数量,这就是为什么爬楼梯问题可以用斐波那契数列来解决的原因。

 P1002 [NOIP2002 普及组] 过河卒

P2437

n, m = map(int, input().split())  # 从标准输入中读取两个整数,分别赋值给变量 n 和 m

dp = ['0' for _ in range(m + 10)]  # 创建一个长度为 m+10 的列表 dp,并将其初始化为字符串 '0'

dp[n] = 1  # 将 dp 列表中的第 n 项设置为 1
dp[n + 1] = 1  # 将 dp 列表中的第 n+1 项设置为 1

for i in range(n + 2, m + 1):  # 从 n+2 开始迭代到 m,计算斐波那契数列的剩余项
    dp[i] = dp[i - 1] + dp[i - 2]  # 计算斐波那契数列的第 i 项,根据递推关系,即前两项的和

print(dp[m])  # 打印斐波那契数列的第 m 项的值

P1928 外星密码

string.rindex()是从右向左找

def unzip(s):
    s = s.strip('[]')  # 去掉字符串两端的方括号
    cout = 0  # 初始化计数器
    for t in s:  # 遍历字符串中的每个字符
        if t in [f'{i}' for i in range(10)]:  # 如果字符是数字0-9中的一个
            cout += 1  # 计数器加1
    temp = s[cout:]  # 将计数器之后的部分作为解压后的字符串
    n = int(s[:cout])  # 将计数器之前的部分转换为整数,表示重复次数
    return temp * n  # 返回解压后的字符串

s = input()  # 从标准输入读取字符串

while True:
    try:
        left = s.rindex('[')  # 从右向左找到最后一个左方括号的索引
        right = s.index(']', left)  # 在左方括号之后找到对应的右方括号的索引
    except:
        break  # 如果找不到左右方括号,则退出循环
    temp = s[left:right + 1]  # 获取此时的压缩片段,例如:'[2ef]'
    s = s.replace(temp, unzip(temp))  # 将压缩片段解压,并替换原字符串中的压缩片段

print(s)  # 打印解压后的字符串

有点没看懂

str.replace(old, new[, count]) 方法用于将字符串中的所有旧子字符串替换为新子字符串。它返回一个新的字符串,其中所有出现的旧子字符串都被替换为新子字符串。

  • old:需要被替换的子字符串。
  • new:用于替换的新子字符串。
  • count:可选参数,表示替换的最大次数。如果指定,则只替换前 count 次出现的旧子字符串。

例如:

s = "hello world" new_s = s.replace("world", "Python")

print(new_s) # 输出: hello Python

  1. if t in [f'{i}' for i in range(10)]:

    • 这行代码使用了列表推导式 [f'{i}' for i in range(10)],它生成了一个包含字符串形式的数字 0 到 9 的列表。例如,这个列表看起来像 ['0', '1', '2', ..., '9']
    • 因此,if t in [f'{i}' for i in range(10)]: 的意思是:如果变量 t 是字符串形式的数字 0 到 9 中的一个,条件就为真。
  2. if t in [i for i in range(10)]:

    • 这行代码使用了列表推导式 [i for i in range(10)],它生成了一个包含数字 0 到 9 的列表。例如,这个列表看起来像 [0, 1, 2, ..., 9]
    • 因此,if t in [i for i in range(10)]: 的意思是:如果变量 t 是数字 0 到 9 中的一个,条件就为真。

总的来说,这两行代码的作用是相同的,都是用来检查变量 t 是否在数字 0 到 9 中。只是一个用了字符串形式的数字,而另一个用了整数形式的数字。

P1010 [NOIP1998 普及组] 幂次方


##抄的大佬代码,不好懂
import math

def micifang(n):
    flag=False  # 判断是否输出‘+’
    while n!=0:
        i=int(math.log2(n))# 获取当前最大的幂次,如:log2(137) = 7.xxx, int()直接得到了7
        if flag:# 判断是否是第一个元素
            print("+",end="")
        if i==0:# 如果为n=2**1则不需要递归了直接输出
            print("2(0)",end="")
        elif i==1:# 如果n=1则不需要递归了直接输出
            print("2",end="")
        else: # 随后按照要求输出递归就行了
            print("2(",end="")
            micifang(i)
            print(")",end="")
        n=n-2**i# 更新n值
        flag=True
n=int(input())

micifang(n)###不用print,在执行时已经打印了

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值