python算法:5人分鱼

一,认识递归函数

1,什么是递归?
递归的工作原理是,如果函数需要处理的问题大小合适,则直接求解并返回结果,
否则将问题分解成两个或多个更小的子问题,并对子问题进行相同的处理,
直到问题无法分解为止

2,什么是递归函数:
递归函数(recursive function)是指在函数体中可以调用自己的函数

3,语法

def fn():
    # ...
    if condition:
        # 停止自我调用
    else:
        fn()
    # ...

4,递归函数的优点和缺点

递归函数的优点:它们可以帮助程序员在处理复杂问题时提供一种简单且易懂的解决方案。
递归函数使代码具有可读性和可重用性,
而且可以使用递归函数解决使用其他方法难以处理的问题。
递归函数的缺点: 递归函数可能会在运行时占用较多的系统资源,
因为它们需要在堆栈上存储多个函数调用
其次,递归函数可能导致代码变得不容易理解,
因为它具有一定的复杂度

二,五人分鱼问题与解决思路:

1,问题:

A,B,C,D,E 5人合伙夜间捕鱼,上岸时都疲惫不堪,各自在湖边的树丛中找地方就睡觉了。

清晨,第一个人醒来,将🐟分成5份,把多余的一条扔回湖中,拿自己的一份回家了;

第二个人醒来,也将🐟分成5份,扔掉多余的一条🐟,拿自己的一份回家了;

接着,其余3人依次醒来,也都按同样的办法分🐟。

问:5人至少共捕到多少条鱼?每人醒来后看到多少条鱼?

2,思路

fish[0]为5个人合伙捕鱼的总数,也是A看到的条数

fish[1]=((fish[0]-1)/5)*4,也是B看到的条数

fish[2]=((fish[1]-1)/5)*4,也是C看到的条数

fish[3]=((fish[2]-1)/5)*4,也是D看到的条数

fish[4]=((fish[3]-1)/5)*4,也是E看到的条数

3,要注意的地方:

每个人看到的鱼的数量 – 1 之后,
可以分成平均分成5份,即:可以被5整除,
这是分鱼成立的条件
假设第5个人E给自己分配了i条
则它看到的数量是i*5+1条,
这需要从第5个人一直逆推到第一个人,
如果每一个人看到的数量-1后都可以平均分成5份且是整数,
则表示数字正确
因为不确定第五个人E给自己分配的数量是多少,
我们用while循环方式,从1开始试探,
看哪个数字符合条件

三,编写代码:

1,递归方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 递归函数
# n: 人,从1到5
# z: 鱼的数量
def fish(n, z):
    if (z - 1) % 5 == 0:    # 鱼的数量能否分成5份
        if n == 5:    # 到最后一个人时仍然可以分成5份,成功
            return 1
        else:
            # 下一个人看到的鱼的数量
            return fish(n + 1, (z - 1) / 5 * 4)
    else:
        return 0
 
i = 0     # 计数器
while True:
    i += 1
    x = i * 5 + 1     # 鱼的数量
    if fish(1, x):
        print('鱼的数量:', x)
        break

运行结果:

鱼的数量: 3121

说明:刘宏缔的架构森林—专注it技术的博客,
网址:https://imgtouch.com
本文: https://blog.imgtouch.com/index.php/2024/03/11/python-suan-fa-5-ren-fen-yu/
代码: https://github.com/liuhongdi/ 或 https://gitee.com/liuhongdi
说明:作者:刘宏缔 邮箱: 371125307@qq.com

2,while循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
i = 0  # 计数器
while True:
    i += 1
    x = i * 5 + 1  # 鱼的数量
    is_all_mod = 1  # 是否5次分鱼都是整数
    num = # 鱼的数量
    for one in range(1, 6):
        if one == 1:
            num = x
        else:
            num = (num - 1) / 5 * 4
        # 鱼的数量有一次不是整数,则设置is_all_mod值为0
        if (num - 1) % 5 == 0:
            is_all_mod = 1
        else:
            is_all_mod = 0
    # 如果5次分鱼时数量都是整数
    if is_all_mod == 1:
        print('鱼的数量:', x)
        break

运行结果:

鱼的数量: 3121
posted @ 2024-05-15 10:14  刘宏缔的架构森林  阅读(161)  评论(0编辑  收藏  举报