Python(六)Python练习

练习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%
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值