递归和递推
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
-
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 中的一个,条件就为真。
- 这行代码使用了列表推导式
-
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,在执行时已经打印了