复习与扩展
- 学习目标
- 了解递归的概念(如阶乘、斐波那契数列)
- 反思计算器程序的可扩展性,尝试用字典映射操作符与函数
- 实践任务
- 编写递归函数
factorial(n)计算阶乘。 - 优化计算器:支持输入表达式如 “3 + 5”(字符串解析),或增加历史记录功能。
- 编写递归函数
- 挑战任务
实现一个能计算任意多个数字平均值的函数avg(*args),使用sum和len。
递归
递归是函数自己调用自己的技巧,把一个复杂的大问题拆解成一个个和原问题结构相同,规模更小的子问题来解决。
递归的两个核心条件
- 基线条件(终止条件):问题最简单,不用在拆分的情况,必须有,否则会无限递归。
- 递归条件:函数调用自身,缩小问题规模。逐步逼近基线条件。
阶乘
正整数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()