第28天:复习与扩展——递归,优化计算器-CSDN博客

12 阅读3分钟

复习与扩展

  • 学习目标
    • 了解递归的概念(如阶乘、斐波那契数列)
    • 反思计算器程序的可扩展性,尝试用字典映射操作符与函数
  • 实践任务
    1. 编写递归函数 factorial(n) 计算阶乘。
    2. 优化计算器:支持输入表达式如 “3 + 5”(字符串解析),或增加历史记录功能。
  • 挑战任务
    实现一个能计算任意多个数字平均值的函数 avg(*args),使用 sumlen

递归

递归是函数自己调用自己的技巧,把一个复杂的大问题拆解成一个个和原问题结构相同,规模更小的子问题来解决。

递归的两个核心条件

  1. 基线条件(终止条件):问题最简单,不用在拆分的情况,必须有,否则会无限递归。
  2. 递归条件:函数调用自身,缩小问题规模。逐步逼近基线条件。

阶乘

正整数n的阶乘记作n!,表示从1连续乘到n
规定:0!=1,1!=1
推导公式:n!=nx(n-1)!
基线条件:0!=1,1!=1
递归条件:n!=n*(n-1)!

def factor(n):
    if n<0:
        return "负数没有阶乘"
    if n==0 or n==1:
        return  1
    return n*factor(n-1)
print(factor(10))

在这里插入图片描述

斐波那契数列

又叫做黄金分割数列:
前两项F1=1,F2=1
递推关系:Fn=Fn-1+Fn-2
基线条件:F1=1,F2=1
递归条件:Fn=Fn-1+Fn-2

def fib(n):
    if n==1 or n==2:
        return 1
    return fib(n-1)+fib(n-2)
print(fib(10))

在这里插入图片描述

计算机程序扩展——字典映射操作符与函数

def add(x,y):
    return x+y
def subtract(x,y):
    return x-y
def multiply(x,y):
    return x*y
def divide(x,y):
    if y==0:
        chra="除数不能为0"
        return chra
    return x/y
operator_map={
    "+":add,
    "-":subtract,
    "*":multiply,
    "/":divide
}
def calculator():
        x=int(input("请输入第一个数字:"))
        op = input("请输入操作符:")
        y=int(input("请输入第二个数字:"))
        if op in operator_map:
            result=operator_map[op](x,y)
            return result
        else:
            return "错误不支持的操作符。"
print(calculator())

在这里插入图片描述

优化计算器——支持输入表达式

def add(x,y):
    return x+y
def subtract(x,y):
    return x-y
def multiply(x,y):
    return x*y
def divide(x,y):
    if y==0:
        chra="除数不能为0"
        return chra
    return x/y
operator_map={
    "+":add,
    "-":subtract,
    "*":multiply,
    "/":divide
}
def calculator():
        str1=input("请输入表达式:").strip()
        parts=str1.split()
        num1=int(parts[0])
        op=parts[1]
        num2=int(parts[2])
        if op in operator_map:
            result=operator_map[op](num1,num2)
            return result
        else:
            return "错误不支持的操作符。"
print(calculator())

在这里插入图片描述

优化计算器——历史记录

def add(x,y):
    return x+y
def subtract(x,y):
    return x-y
def multiply(x,y):
    return x*y
def divide(x,y):
    if y==0:
        chra="除数不能为0"
        return chra
    return x/y
operator_map={
    "+":add,
    "-":subtract,
    "*":multiply,
    "/":divide
}
history =[]
def history_show():
    print(f"=====计算历史=====")
    for i in history:
        print(i)
def calculator(str1):
        parts=str1.split()
        num1=int(parts[0])
        op=parts[1]
        num2=int(parts[2])
        if op in operator_map:
            result=operator_map[op](num1,num2)
            history.append(f"{str1}={result}")
            return result
        else:
            return "错误不支持的操作符。"
def main():
    print("=====计算器=====")
    print("支持输入:1 + 2等")
    print("指令:history查看记录|clear清空记录|exit退出")
    while True:
         ex = input("请输入表达式:").strip()
         if ex.lower()=="history":
             history_show()
             continue
         elif ex.lower()=="clear":
             history.clear()
             print("历史记录已清除")
             continue
         elif ex.lower()=="exit":
             print("再见")
             break
         print(calculator(ex))
if __name__ == '__main__':
    main()

在这里插入图片描述

计算任意多个数字的平均值

def avg(*args):
    sum=0
    for arg in args:
        sum+=int(arg)
    avgs=sum/len(args)
    return avgs
def main():
    print("=====平均值计算=====")
    num=input("请输入任意数字以空格隔开:").strip()
    arg=num.split()
    print(f"{num}的平均数是{avg(*arg)}")
if __name__ == '__main__':
    main()

在这里插入图片描述