蓝桥杯软件类考点1:枚举

本文详细解释了枚举、枚举算法和函数递归在Python中的应用,涉及实例、数学问题(如三角形煤球、最大素数和完美立方)以及基础编程任务(如阶乘和进制转换)。
摘要由CSDN通过智能技术生成

一、前提声明

1、什么是枚举


枚举(Enumeration)是一种数据类型,它允许程序员定义一个包含一组命名常量的集合。这些常量在枚举内被称为枚举成员,它们代表了一组相关联的值。

让我们以一个简单的例子来说明。假设你在编写一个程序,需要表示不同颜色。你可以使用枚举来定义这些颜色,让代码更清晰易懂。

用python可以这样定义一个颜色的枚举类型:

# Python示例
from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3


这里我们创建了一个名为Color的枚举类型,其中包含了三个枚举成员:RED、GREEN和BLUE,分别对应整数值1、2和3。在实际编程中,你可以使用这些枚举成员来代表不同的颜色,比如:

selected_color = Color.RED
print(selected_color)  # 输出: Color.RED
print(selected_color.value)  # 输出: 1

这样,枚举类型帮助你更清晰地表示代码中的颜色选项,提高了可读性和可维护性。

2、什么是枚举算法

        枚举也叫穷举(穷尽列举),基于逐个尝试答案的一种求解策略,简单来说:枚举就是将问题的可能解依次列举出来,然后一一带入问题检验,从而从系列可能解中获得能够解决问题的精确解。
        没以有找到规律,或者短时间内想不出来更好地办法的时候,可尝试遍历所有可能的结果去一个一个的试,找出其中符合条件的。并不是所有题目都能枚举!
        当「可能解」的筛选条件不清晰,导致「可能解」的数量和范围无法准确判断时,枚举就失去了意义。纯暴力的题目越来越少,但如果能暴力出部分解,是可以帮我们拿到一些分数的!

3、什么是函数的递归调用

        函数的递归调用是指函数在执行过程中调用自身的过程。递归是一种解决问题的方法,通过将问题分解成更小的、与原问题类似的子问题来解决。在递归调用中,函数会重复调用自身,并以不同的参数或条件来执行,直到达到了基本情况(也称为基础情况或终止条件)。基本情况是递归函数停止调用自身并返回结果的条件,避免无限循环调用。

递归函数通常具有两个部分:

基本情况: 这是递归过程中最终停止的条件。当满足基本情况时,递归不再进行,函数直接返回一个确定的值。

递归情况: 这是函数调用自身的部分。在这个阶段,函数使用不同的输入或条件调用自身来解决问题,通常问题规模更小,接近基本情况。

递归可以很好地解决一些问题,比如数学中的阶乘、斐波那契数列等,但需要小心处理,确保递归函数在某个时刻能够到达基本情况,避免无限循环。

例如,下面是一个计算阶乘的递归函数示例:

def factorial(n):
    if n == 0 or n == 1:  # 基本情况
        return 1
    else:  # 递归情况
        return n * factorial(n - 1)

result = factorial(5)
print(result)  # 输出: 120

在这个示例中,factorial 函数通过不断地调用自身来计算阶乘,直到 n 减少到基本情况。

二、试题练习

1、三角菱锥


有一堆煤球,堆成三角棱锥形。具体:第一层放1个,第二层3个(排列成三角形),   第三层6个(排列成三角形),第四层1o个(排列成三角形),如果一共有1oo层,共有多少个煤球?

def total_ball(level):
    total = 0
    for i in range(1,level+1):
        level_num = i*(i+1)//2   #第level层数量
        total += level_num
    return total

if __name__ == '__main__':
    level =100
    total_ball = total_ball(level)
    print(total_ball)

2、最大素数

例如:求小于N的最大素数:()
---没有规律可循也没有对应的公式,用笨办法,一个一个去尝试
---枚举(暴力)

'''
素数是指大于1的自然数,它除了1和自身外没有其他正因数的数。换句话说,
如果一个数只能被1和它自身整除,那么这个数就是素数。
'''

def is_prime(num):
    if num < 2:
        return False
    for i in range(2,int(num**0.5)+1):
        if num % i == 0:
            return False
    return True

def max_leng(N):
    if N <= 2:
        return None

    for num in range(N-1,1,-1):
        if is_prime(num):
            return num

if __name__ == '__main__':
    N = 1000
    result = max_leng(N)
    if result:
        print(f'小于{N}的最大素数是{result}')
    else:
        print(f'不存在小于2的素数')

3、完美立方

形如a3=b3+c3+d3的等式被称为完美立方等式。例如12^3=6^3+8^3+10^3。
编写一个程序,对任给的正整数N(N<=100)。寻找所有的四元组(a,b,c,d),使得它们满足:a3=b3+c3+d3,其中a,b,c,d大于1,小于等于N。且b<=c<=d。
输入:一个正整数N(N<=100)
输出:每行输出一个完美立方,
输出格式为: Cube=a,Triple=(b,c,d)其中a,b,c,d所在位置分别用实际求出四元组值代入。请按照a的值,从小到大依次输出,当两个完美立方等式中的a的值相同,则b值小的优先输出,再相同则c值小的优先输出...
 

def find_perfcet_cubes(N):
    result = []
    for a in range(2,N+1):
        for b in range(2,a):
            for c in range(b,a):
                for d in range(c,a):
                    if a**3 == b**3 + c**3 +d**3:
                        result.append((a,b,c,d))
    result.sort()  #大到小排列

    for result in result:
        a,b,c,d = result
        print(f'Cube={a},Triple=({b},{c},{d})')

if __name__ == '__main__':
    N = 50
    find_perfcet_cubes(N)

4、百钱百鸡

鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?
白话文:公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?
 

def solve_chicken_issue():
    for x in range(0,21):  #最多20只
        for y in range(0,34):  #最多33只
            z = 100 - x - y
            if 5*x + 3*y + z/3 == 100:
                print(f'公鸡为{x}只,母鸡{y}只,小鸡{z}只')

if __name__ == '__main__':
    solve_chicken_issue()

5、数的阶乘

已知一个正整数n,求n的阶乘(n<20)
 

def DiGui(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n*DiGui(n-1)

if __name__ == '__main__':
    n = eval(input('请输入一个小于20的数:'))
    result = DiGui(n)
    print(f'{n}的阶乘为{result}')

6、进制转换

将123转换成等值的二进制数

def zhaunhuan(N):
    if N > 1:
        zhaunhuan(N // 2)
    print(N % 2,end='')

if __name__ == '__main__':
    num = 123
    print(f'{num}的二进制为:',end='')
    zhaunhuan(num)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值