《练习100》26~30

题目26

# 利用递归函数调用方式,将输入的5个字符,以相反顺序打印出来

# str 本身提供了翻转的方法
# 为了构建一个正确的递归函数,我们需要有一个不需要继续递归的基本情况,不然的话递归就变成了无限循环。
# 思路: 每次取开始位置的字符,然后逆序拼接
# 输入: asdfg
# 如何取第一个字符:s[0], s[0:1]
# 如何逆序拼接: 递归有返回值的是最深的那次调用: 最后次调用的返回值为'' 
# 倒数第二次调用的就是 ‘’+‘g’
# 依次类推: ‘’+'g'+'f'+'d'+'s'+'a' 和在一起就是gfdsa 正好的输入的逆序

def my_reserve(s):
    if s == "":
        print('s = ""')
        return s
    else:
        print(f"my_reserve(s[1:]) + s[0] = my_reserve({s[1:]}) + {s[0]}")
        return my_reserve(s[1:]) + s[0]

name=''
try:
    for i in range(5):
        tmp = input(f"总共需要5个,请输入第{i+1}个字符:")
        if len(tmp) >1:
            raise ValueError("输入的字符超长")
        name += tmp
    print("你输入的字符顺序是:", name)
    print(my_reserve(name))
except ValueError as e:
    print("请输入如何要求的长度", e)

题目27

# 有五个人,第五人比第四人大2岁,第四比第三大2岁,以此类推,第一人10岁,求第五人的岁数
#  fn = fn-1 + 2 n > 1, n = 1时, f1 = 10

def get_age(n):
    if n == 1:
        return 10
    
    return get_age(n-1) + 2

for i in range(1,6):
    print(f"第{i}{get_age(i)}岁")

题目28

# 给一个不多于5位的数字,求其是几位数字,逆序打印各位数字

# 将数字转为str,然后求str的长度即可
def get_num_of_digits(num:int):
    return len(str(num))

# 逆序
def reserver(num:str):
    if num == '':
        return num
    return reserver(num[1:]) + num[0]

print(f"12340 是一个{get_num_of_digits(12340)}位数, 逆序输出为 : {reserver(str(12340))}")


# 第二种:分别获取各个位置上的数字,由于最多5位   
def get_num_of_digits1(num:int, max:int = 5):
    """获取数字各个位置上的数字,并逆序输出

    Args:
        num (int): 待解析的数字
        max (int): 预期解析的长度
    """
    nums = ''
    for i in range(len(str(num))):
        tmp = '1' + '0' * i
        tmp = str(num//int(tmp))
        nums+= tmp[len(tmp) -1]
    print(f"数字{num},是一个{len(nums)}位数,逆序输出为:{nums}")
    
get_num_of_digits1(1234500,10)

题目29

# 判断一个5位数字是否是回文。
# 中间数字的左右两边是对称的(正序与反序一样)
 
# 第一种利用字符串切片
def is_palindrome(num:int):
    str_before = str(num)
    str_after = str(num)[::-1]
    
    if str_before == str_after:
        print(f"数字{num}是回文")
        return True
    return False                  

is_palindrome(12421)
is_palindrome(12345)

# 第二种利用index可以为负,代表倒数.以中间位置的元素为分界线
# index 0 和index -1比较
# index 1 和index -2比较
def is_palindrome1(num:int):
    # 数字转字符串
    tmp = str(num)
    # 获取一半的位置
    for i in range(len(tmp)//2):
        if tmp[i] != tmp[-i -1]:
            return False
    print(f"数字{num}是回文")  
    return True
    
is_palindrome1(12421)
is_palindrome1(12345)

for i in range(1002):
    is_palindrome(i)
    is_palindrome1(i)

题目30

# 请输入星期几的第一个字母来判断是星期几,如果第一个字母一样,则继续判断第二个字母
# 思路,根据字母筛选,直到只剩一个结果。那么这个结果就是输入的
week = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday']

def guess_day_of_week():
    index = 0
    while True:    
        try:
            first = str(input(f"请输入第{index+1}个字母:"))
            if len(first) > 1:
                raise ValueError(f"请输入一个字母,当前输入{len(first)}个!!!!")
            
            if not first.isalpha():
                raise ValueError(f"请输入字母,当前输入的{first},不是字母!!!!")
           
            # 这一段是不是可以用递归实现,备选范围和比较的字母在随着调用次数变化而变化 
            filter1 = []
            for i in week:
                if i[index] == first:
                    filter1.append(i)
                    continue
            print(f"输入的第{index+1}个字母是{first},目前的备选有{filter1}")
            if len(filter1) > 1:
                index += 1
                continue
            elif len(filter1) == 1:
                print(filter1[0])
                return filter1[0]
            else:
                raise ValueError("请输入周一到周日的英文字母。")
        except ValueError as e:
            print(e)

# guess_day_of_week()


# 递归实现周几匹配
def guess_day_of_week1(day_range: list,index:int = 0):
    if len(day_range) == 1:
        return day_range[0]
    elif not len(day_range):
        print("当前输入的字母没有备选的星期几")
        return None
    first = ''
    
    # 这一段是确保用户输入的是一个字母
    while True:
        try:
            first = str(input(f"请输入第{index + 1}个字母:"))
            if len(first) > 1 :
                raise ValueError(f"请输入一个字母,当前输入{len(first)}个!!!!")
            
            if not first.isalpha():
                raise ValueError(f"请输入字母,当前输入的{first},不是字母!!!!")
            break
        except ValueError as e:
            print(e)
        except IndexError:
            print("无法猜测当前输入的是周几。")
    
    # 这一段才是真正的在根据用户的输入从备选中筛选
    filter1 = []
    for i in day_range:
        if i[index] == first[0]:
            filter1.append(i)
            continue
    
    return guess_day_of_week1(filter1, index + 1)

print(guess_day_of_week1(week))

你可能感兴趣的:(Python学习笔记,python,开发语言,学习)