1、汉诺塔
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
def hanoi(n, A, B, C): # 定义汉诺塔函数,参数n是圆盘数,A、B、C是3根柱
if n == 1: # 判断圆盘数,如果等于1,递归条件
print(A, '-->', C, ' ', n) # 直接将A柱上的圆盘移动到C柱上
else: # 否则,进行递归移动
hanoi(n - 1, A, C, B) # 递归将A柱最上方的n-1个盘子落在B柱
print(A, '-->', C, ' ', n) # 输出将A柱上的圆盘移动到C柱上,也就是将A柱的最小面盘子落在C柱
hanoi(n - 1, B, A, C) # 递归将B柱上的n-1个盘子,落在C柱
n = int(input("请输入层数:"))
hanoi(n, 'A', 'B', 'C')
结果:
请输入层数:3
A --> C 1
A --> B 2
C --> B 1
A --> C 3
B --> A 1
B --> C 2
A --> C 1
2、输入三边的长度,求三角行的面积和周长
import math # 导入Python的math模块,以便后面可以使用数学函数(sqrt平方根)
# 输入三边长度
a = float(input("请输入第一边的长度:"))
b = float(input("请输入第二边的长度:"))
c = float(input("请输入第三边的长度:"))
# 验证是否构成三角形
if a + b > c and a + c > b and b + c > a:
# 计算周长
C = a + b + c
# 使用海伦公式计算面积
s = (a + b + c) / 2
area = math.sqrt(s * (s - a) * (s - b) * (s - c))
print(f"这是一个三角形")
print(f"三角形的周长为:{C}")
print(f"三角形的面积为:{area}")
else:
print(f"这不是一个三角形")
结果:
请输入第一边的长度:1
请输入第二边的长度:2
请输入第三边的长度:3
这不是一个三角形
请输入第一边的长度:3
请输入第二边的长度:4
请输入第三边的长度:5
这是一个三角形
三角形的周长为:12.0
三角形的面积为:6.0
3、鸡兔同笼,从上边看35个头,从下边看94只脚,请问鸡有几只,兔子有几只
def chicken_rabbit(heads,legs):
# 循环遍历所有可能的鸡数量
for chickens in range(heads + 1):
rabbits = heads - chickens
total_legs = 2 * chickens + 4 * rabbits
if total_legs == legs:
return chickens,rabbits
return 0,0 #遍历完无满足返回值,返回0,无解
heads = 35
legs = 94
# heads = int(input("请输入头的数量:"))
# legs = int(input("请输入腿的数量:"))
chickens,rabbits = chicken_rabbit(heads,legs)
if chickens != 0:
print(f"鸡有{chickens}只,兔子有{rabbits}只")
else:
print("无解")
结果:
鸡有23只,兔子有12只
4、编写一个函数,接收一个整数作为参数,判断该整数是否为素数(质数),并返回True或False。
def is_prime(n):
for i in range(2, n):
if (n % i) == 0: #如果有除1和它本身以外有其他因数
return 0
return 1 #必须与循环并列,循环结束无返回就返回1
# 素数一般指质数。质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
# 合数是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数
# 调用
number = int(input("请输入一个整数:"))
if is_prime(number):
print(f"{number}是质数")
else:
print(f"{number}是合数")
结果:
请输入一个整数:35
35是质数
请输入一个整数:5
5是质数
请输入一个整数:6
6是合数
5、一对兔子,每对兔子从出生的第三个月开始,每个月都会生一对小兔子,而每对兔子都会在出生后的第三个月达到性成熟,之后每月都会再生一对小兔子。
问题的关键是:如果我们从一对刚满月或刚出生的兔子开始,经过多少个月后,会有多少对兔子?
说法一:第一个月兔子满月
def rabbit_number(months):
# 初始化第一个月、第二个月和第三个月大的兔子对数
month_1, month_2, month_3 = 1, 0, 0
for i in range(1, months+1):
# 计算下一个月的兔子对数
temp = month_2
month_2 = month_1
month_1 = month_3 #以3月大兔子数量来产生1月大兔子数量
month_3 = temp + month_3 #注意:原3月大的兔子需加上,用来判断1月大兔子的数量
# 或者tem2, tem1, tem3 = tem1, tem3, tem2 + tem3
# rabbit = (month_1 + month_2 + month_3)
return month_1 + month_2 + month_3
# 输入经过多少个月
months = int(input("请输入经过多少个月:"))
rabbit_number(months)
print(f"经过{months}个月后,有{rabbit_number(months)}对兔子")
结果:
请输入经过多少个月:8
经过8个月后,有13对兔子
说法一:第一个月兔子满月(即结束时统计刚踏入2月大)如下图解释
#说法二:第一个月兔子刚出生
def rabbit_number(months):
# 初始化第一个月、第二个月和第三个月大的兔子对数
month_1, month_2, month_3 = 1, 0, 0
for i in range(1, months):
# 计算下一个月的兔子对数
temp = month_2
month_2 = month_1
month_1 = month_3 #以3月大兔子数量来产生1月大兔子数量
month_3 = temp + month_3 #注意:原3月大的兔子需加上,用来判断1月大兔子的数量
# 或者tem2, tem1, tem3 = tem1, tem3, tem2 + tem3
# rabbit = (month_1 + month_2 + month_3)
return month_1 + month_2 + month_3
# 输入经过多少个月
months = int(input("请输入经过多少个月:"))
rabbit_number(months)
print(f"经过{months}个月后,有{rabbit_number(months)}对兔子")
结果:
请输入经过多少个月:8
经过8个月后,有9对兔子
总结:简单来说就是月份的认知,将for循环的次数+1或-1即可