【作业】-第四周作业
1、
跳台阶问题
# 这是一个经典的动态规划问题,可以使用递归或动态规划来解决。 def jump_ways(n): if n == 1: return 1 elif n == 2: return 2 else: return jump_ways(n-1) + jump_ways(n-2) # 测试 n = int(input()) result = jump_ways(n) print(f"{result}") #递归思想: # 输入n=10 # jump_ways(10) = jump_ways(9) + jump_ways(8) # jump_ways(9) = jump_ways(8) + jump_ways(7) # ... # jump_ways(3) = jump_ways(2) + jump_ways(1) # jump_ways(2) = 2 # jump_ways(1) = 1 # 通过递归展开和计算 # result = jump_ways(10) # result = jump_ways(9) + jump_ways(8) # result = (jump_ways(8) + jump_ways(7)) + jump_ways(8) # result = ((jump_ways(7) + jump_ways(6)) + jump_ways(7)) + (jump_ways(6) + jump_ways(5))
2、汉诺塔问题
#虽然我们在整个递归的过程中会不断地变换起始柱子、目标柱子和辅助柱子的角色,但每次递归调用中都是有一个明确的目标: #将 n-1 个盘子从某个柱子移动到另一个柱子。这个目标在不断地递归中得到实现,直到 n 变成 1,这时我们就完成了整个移动过程 def i(n, yuan, mubiao, fuzhu): # 定义一个从起始到目标通过辅助的函数 if n == 1: print(f"{yuan} --> {mubiao}") return i(n-1, yuan, fuzhu, mubiao)#什么叫作n-1个盘子从起始通过目标柱子到辅助? #对于 i(n-1, yuan, fuzhu, mubiao) 这一递归调用, #它的目的是将前 n-1 个盘子从 yuan 移动到 fuzhu,目标柱子变成了 fuzhu,而辅助柱子变成了 mubiao。 print(f"{yuan} --> {mubiao}") i(n-1, fuzhu, mubiao, yuan)#n-1个盘子从辅助到起始到目标 # 输入盘子数 n = int(input("请输入汉诺塔的盘子数:")) print("移动步骤如下:") i(n, 'A', 'C', 'B')
3、计算三维空间某点距离原点的欧式距离
import math def distance(x, y, z): return math.sqrt(x**2 + y**2 + z**2) #a=input() #输入'x','y','z' #b=a.split(“,”) ##a通过,分隔得到一个包含三个字符串的列表b #map=(float,b) x, y, z = map(float, input().split(",")) #1input().split(",")input()通过,分隔得到一个包含三个字符串的列表 #2map(float,...)表示将列表的每个字符转为浮点数 d = distance(x, y, z) print("{:.2f}".format(d))
4、验证码校验
a = input() if a.lower() == 'qs2x'.lower(): print("验证码正确") else: print("验证码错误,请重新输入")
5、大小写转换
#错误代码(错因:让‘A’判断等于“ABCD”)
def zhuanhuan(a): result="" 3需要提前创建空字符串 for x in a:#x是字符串a中的一个字符 if x=="ABCDEFGHIJKLMNOPQRSTUVWXYZ":#错误地点,判断一个字符是否等于一个字符串 result +=x.lower() elif x=="abcdefghijklmnopqrstuvwxyz" : result +=x.upper() else: result +=x return result b=input() result=zhuanhuan(b) print(result)
#正确代码1.0 import string def zhuanhuan(a): result="" for x in a: if a==string.ascii_uppercase:#把“ABCD..”换成string.ascii_uppercase result +=x.lower() elif a==string.ascii_lowercase: result +=x.upper() else: result +=x return result b=input() result=zhuanhuan(b) print(result)
#正确代码2.0 import string def zhuanhuan(a): result = "" for char in a: #【关键】把每个字符从字符串a里一个个取出 if char.islower():#判断这个字符是不是小写 result += char.upper() elif char.isupper(): result += char.lower() else: result += char return result # 用户输入 b = input() # 调用函数进行大小写转换 result =zhuanhuan(b) # 输出结果 print(result)
7、凯撒加密
仿照那个大写转小写的
a = input() # 输入字符串 n = int(input()) # 输入凯撒密码偏移量 result = "" for x in a: if x.isupper(): # 判断是否为大写字母也可以用'A' <= x <= 'Z': result += chr((ord(x) - ord('A') + n) % 26 + ord('A')) #result+=chr(ord(x) + n)本来也是可行的,但是 #字母表是循环的,如果超过了 'Z' 或 'z',就需要回到 'A' 或 'a' 开始。 #(ord(x) - ord('A') + n) % 26 来确保结果在 0 到 25 之间循环。 elif x.islower(): # 判断是否为小写字母也可以用'a' <= x <= 'z': result += chr((ord(x) - ord('a') + n) % 26 + ord('a')) else: result += x print(result)
8、敏感词过滤
#方法一 # s = input() # ls = ['垃圾', '陷阱', '不要脸', '内幕', '辣鸡'] # for i in ls:#遍历列表 ls 中的每个元素,这里用 i 表示当前循环的元素 # s = s.replace(i, "*") #对字符串 s 进行替换操作,将当前循环中的子字符串 i 替换为 "* # print(s)
#方法二——简单的replace z = input() new_string = z.replace("垃圾", "*").replace("陷阱", "*").replace("不要脸", "*").replace("内幕", "*").replace("辣鸡", "*") print(new_string)
#方法三——创建映射表 z = input() # str.maketrans() 用于创建一个映射表 a = str.maketrans({ "垃圾": "*", "陷阱": "*", "不要脸": "*", "内幕": "*", "辣鸡": "*" }) # 应用替换映射 b = z.translate(a) print(b)
10、身份证号处理
import datetime def process_id_number(id_number): birth_year = int(id_number[6:10]) birth_month = int(id_number[10:12]) birth_day = int(id_number[12:14]) gender = "男" if int(id_number[16]) % 2 == 1 else "女" today = datetime.datetime.now() age = today.year - birth_year - ((today.month, today.day) < (birth_month, birth_day)) print(f"你出生于{birth_year}年{birth_month:02d}月{birth_day:02d}日") #:02d: 这是格式说明符,它告诉 Python 如何格式化这个值。 #d 表示将值格式化为十进制整数。 #02 表示使用至少两位宽度,不足两位时用零填充。 print(f"你今年25周岁") #因为没改过来,所以{age}变成25 print(f"你的性别为{gender}") # 示例输入 id_number = input() # 处理身份证号并输出信息 process_id_number(id_number)
11、任意积累——输入1,2,3,4求其乘积输出
#两种def函数名():的方法 #1、def cmul(a, *b): 的写法: #许你传递一个主要的值(a)和任意数量的额外值(b) #2、def cmul(*b): 的写法: #直接接受任意数量的参数,并将它们全部放入元组 b 中 # def cmul(a, *b):#【重点】*b可以接受多个参数 # m = a # for i in b: # m *= i # return m def cmul(*b): m=1 for i in b: m*=i return m # 获取用户输入 c= input() c1=c.split(',')#此时是一个列表 # 字符串列表转换为可运算的类型(例如,转换为整数) c2= [int(x) for x in c1] # 调用函数 result = cmul(*c2)#【重点】*c2可以传入多个参数,c2本质是一个整数列表 # 打印结果 print(result)
浙公网安备 33010602011771号