赞
踩
编写程序,实现从屏幕输入列表A的值,然后通过调用min_max()函数计算所输入的列表A的最小值和最大值。
用分治法同时求n个数a1,a2,...,an
中的最小值Min(1, n)和最大值Max(1, n)的基本思想是:
本节内容中仅可以调用下列两个函数:
1. min(a, b)--返回a和b中较小的元素
2. max(a, b)--返回a和b中较大值元素
根据提示,在右侧编辑器补充代码,计算并输出列表的最大值和最小值。
测试输入:
2,3,4,4.5,65.7
预期输出:
Minimum and Maximum: 2, 65.7
- def min_max(a):
- # # 参数a为列表,编写分治法函数,返回a的最大值和最小值
- # # 注意,有两个返回值
- if len(a) == 1:
- return a[0], a[0]
- elif len(a) == 2:
- return min(a), max(a)
- m = len(a) // 2
- lmin, lmax = min_max(a[:m])
- rmin, rmax = min_max(a[m:])
- return min(lmin, rmin), max(lmax, rmax)
-
-
- if __name__ == '__main__':
- # #编写代码,输入列表A,A列表中的都是数字
- A = [eval(i) for i in input().split(",")]
- # #输入A的的最大值和最小值
- # #下面这行代码不用修改哦~
- print("Minimum and Maximum: %g, %g" % (min_max(A)))
依然是分治算法。
找假币问题是一个比较简单且典型能够体现计算思维的问题。假设现在有n(n>=2)枚硬币,已知其中一枚为假币,且知道假币的重量是比真币轻的,请思考如何用分治思想解决该问题。
本次实验中我们采用二分法解决假币问题。二分法是一个非常典型的分治思想的应用。
这一关比较特殊,要求你对你的每一行代码进行注释,说明它的用途,最终函数运行结果是假币的位置索引和假币的重量。
如果没有假币,索引和重量位置均为-1。
测试输入:
3,3,3,3,3,3,3,2,3
预期输出:
position is: 7 ,weight is: 2.
- # # 全部都自己写8
- def find_coin(a, L):
- x = len(L) # 获取L的长度,即硬币的总数
- if x == 1: # 当硬币的数量为一时,就不用找了
- return a # 直接返回a
- if x % 2 == 1: # 当数量是奇数时
- x -= 1 # 舍弃最后一个硬币
- y = 1 # 记有一个硬币多余
- else: # 否则
- y = 0 # 记为没有硬币多余
- if sum(L[:x // 2]) > sum(L[x // 2:x]): # 如果前一半硬币质量的总和大于后一半硬币质量的总和
- return find_coin(a + x // 2, L[x // 2:x]) # 用同样的方法再次比较前一半硬币和后一半硬币的质量
- elif sum(L[:x // 2]) < sum(L[x // 2:x]) and y == 1: # 如果前一半硬币质量的总和小于后一半硬币质量的总和
- return find_coin(a, L[:x // 2]) # 用同样的方法再次比较前一半硬币和后一半硬币的质量
- else: # 如果两者质量相等
- if y != 0: # 如果有多余的硬币
- if L[0] > L[x]: # 如果第一个硬币的质量大于我们一开始剔除的硬币的质量
- return x # 那么我们就返回最后一个硬币的位置
- else: # 否则
- return -1
- else: # 如果没有多余的硬币
- return -1
-
-
- L = [int(i) for i in input().split(",")]
- a = 0
- m = find_coin(a, L)
- if m != -1:
- print(f"position is: {m}, weight is: {L[m]}.")
- else:
- print("position is: -1, weight is: -1.")
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。