练习1:
"""
编写一个名为collatz()的函数,它有一个名为number的参数。
(1)如果参数是偶数,那么collatz()就打印出number//2,并返回该值。如果number是奇数,collatz()就打印并返回3*number+1。
(2)然后编写一个程序,让用户输入一个整数,并不断对这个数调用collatz(),直到函数返回值1
特点:令人惊奇的是,这个序列对于任何整数都有效,利用这个序列,你迟早会得到1
所谓的“Collatz序列”
- 输入:
3
- 输出:
10
5
16
8
4
2
1
"""
方式1:while true循环+函数
#(1)函数定义
def collatz(number):
if number % 2 == 1:
return number * 3 + 1
elif number % 2 == 0:
# 是偶数就打印
return number // 2
# 套路:用while True + 函数的形式实现!
number = int(input('输入:'))
while True:
#关键!
number = collatz(number)
print(number)
# 说明:这里并没有在函数中通过判断=1的形式exit--->因为程序或许还要向下执行!
if number == 1:
break
方式2:函数递归调用
def collatz(number):
if number == 1:
return 1
if number % 2 == 1:
print(number * 3 + 1)
# 函数的嵌套,不太容易理解!--->函数嵌套的机理!
return collatz(number * 3 + 1)
elif number % 2 == 0:
# 是偶数就打印
print(number // 2)
return collatz(number // 2)
# 调用函数--->这里没有让用户传入数值!
collatz(3)
说明:如何在函数嵌套中进行取舍-->应用在所有高级语言和一些脚本语言!
递归特性
递归的特性:
1、递归函数必须有一个明确的结束条件。
2、每进入更深一层的递归时,问题规模相对于上一次递归都应减少
3、相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
4、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
总结:推荐while True + 函数来代替函数递归!
练习2:
"""
模拟轮盘抽奖游戏
# 轮盘分为三部分: 一等奖, 二等奖和三等奖;
# 轮盘转的时候是随机的,
# 如果范围在[0,0.08)之间,代表一等奖,
# 如果范围在[0.08,0.3)之间,代表2等奖,
# 如果范围在[0.3, 1.0)之间,代表3等奖,
# 模拟本次活动1000人参加, 模拟游戏时需要准备各等级奖品的个数.
"""
import random
#print(random.random())
#(1)字典就是映射
rewardDict = {
'一等奖':(0,0.08),
'二等奖':(0.08,0.3),
'三等奖':(0.3,1)
}
#(2)函数-->隐含概率公式!
def rewardFun():
"""用户的得奖等级"""
# 生成一个0~1之间的随机数(概率)-->[0,1)
number = random.random()
# 判断随机转盘是几等奖-->细节!
for k,v in rewardDict.items():
if v[0] <=number <v[1]:
return k
#测试-->print(rewardFun())
#(3)保存几等奖出现的次数-->古典型概率!
resultDict={}
for i in range(1000):
res = rewardFun()
#第一次出现!-->添加!
if res not in resultDict:
resultDict[res] = 1
else:
#第二次出现!-->修改!
resultDict[res] += 1
for k,v in resultDict.items():
print(k,'---->',v)
# 说明:各获奖概率趋近8%、22%、70%