【作业】-第四周作业

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)

 

posted @ 2023-11-10 16:23  yu4848  阅读(38)  评论(0)    收藏  举报