python 递归调用极min()函数

想请教一下各位网页 这串代码是怎么一步步运行的!

def minbag(n):
    if n > 1:
        if n == 2 or n == 3 or n == 5:
            return 1
        else:
            smallest = minbag(n-2)
            if n > 4:
                smallest = min(smallest, minbag(n-3))
            if n > 6:
                smallest = min(smallest, minbag(n-5))
        return 1 + smallest
    else:
        return 0

首先判断n的大小,如果它大于1,则继续执行,否则返回0
如果n等于2、3或5,则直接返回1(因为此时组成n的最小数字集合只有1个数字)
否则,找到组成数字n的最小数字集合所需的最小数字数目
首先,找到组成n-2的最小数字集合所需的最小数字数目,存入变量smallest
如果n大于4,则再找到组成n-3的最小数字集合所需的最小数字数目,并且与smallest取较小值
如果n大于6,则再找到组成n-5的最小数字集合所需的最小数字数目,并且与smallest取较小值
最后在所需数字数量的基础上加上1,因为我们加入了一个数字,即数字2、3或5
举个例子,当输入参数n=11时: 首先,在满足n > 1的条件下执行代码。接下来,执行如下步骤:

n不等于2、3或5,继续执行
执行minbag(n-2),即minbag(9),此时smallest为3,因为最小组合为2 + 2 + 5
n大于4,继续执行
执行minbag(n-3),即minbag(8),此时smallest为2,因为最小组合为2 + 3 + 3的形式,比3 + 2 + 2更优
n大于6,继续执行
执行minbag(n-5),即minbag(6),此时smallest为2,因为最小组合为2 + 2 + 2,比5 + 2更优
返回最小数字数目1+2=3,即组成数字11的最小数字集合为2 + 3 + 3.
最终,minbag函数返回的是一个整数,表示组成数字n的最小数字集合所需的最小数字数目。

你好 你上面说的内容我都懂但‘n不等于2、3或5,继续执行
执行minbag(n-2),即minbag(9),此时smallest为3,因为最小组合为2 + 2 + 5
n大于4,继续执行
执行minbag(n-3),即minbag(8),此时smallest为2,因为最小组合为2 + 3 + 3的形式,比3 + 2 + 2更优
n大于6,继续执行
执行minbag(n-5),即minbag(6),此时smallest为2,因为最小组合为2 + 2 + 2,比5 + 2更优
返回最小数字数目1+2=3,即组成数字11的最小数字集合为2 + 3 + 3.
最终,minbag函数返回的是一个整数,表示组成数字n的最小数字集合所需的最小数字数目。
’ 第一,这段话中我想知道每一步当中的smallest是怎么算出来的呢?第二,我想知道为程序具体例如“执行minbag(n-2),即minbag(9),此时smallest为3,因为最小组合为2 + 2 + 5 n大于4,继续执行” n为什么大于4呢?或者说它为什么接着走下去了呢?? 麻烦解答一下 我打赏奖金!

  • 文章:python之min 中也许有你想要的答案,请看下吧
  • 除此之外, 这篇博客: 【python】分数计算器中的 最后调整一下 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 加一个循环,让他可以循环使用
    最后代码如下

    from fractions import Fraction
    while True:
        b = int(input('输入第一个分数的分母'))
        a = int(input('输入第一个分数的分子'))
        d = int(input('输入第二个分数的分母'))
        c = int(input('输入第二个分数的分子'))
        e = Fraction(a, b)
        f = Fraction(c, d)
        g = input('选择运算方法(加,减,乘,除)')
        if g == '加':
            print(e + f)
            continue
        if g == '减':    
            print(e - f)
            continue
        if g == '乘':    
            print(e * f)
            continue
        if g == '除':
            print(e / f)
            continue
    
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以回答部分问题:

    如何递归调用Python中的极小化函数min()?

    Python中的min()函数本身并不需要递归调用,因为它只需要传入一个可迭代对象,比如列表、元组等,就可以返回其中的最小值。

    但是,如果需要实现一个递归函数来获取列表中的最小值,可以采用以下实现方法:

    def recursive_min(lst):
        """
        使用递归实现获取列表中的最小值
        """
        if len(lst) == 1:
            return lst[0]
        else:
            return min(lst[0], recursive_min(lst[1:]))
    

    该函数使用了递归的思想,将列表分为第一个元素和剩余部分,然后比较第一个元素和剩余部分的最小值,直到列表中只剩下一个元素,此时返回该元素。

    请帮我分析一下以下代码的执行过程:

    该代码是一个名为MinStack的类,实现了一个带有min函数的栈。该栈在每次push新元素时,将当前栈中的最小值和新元素比较,将较小值添加到一个辅助栈中。这样,在调用min函数时,直接返回辅助栈中的栈顶元素,即为当前栈中的最小值。

    具体的执行过程如下:

    • 初始化一个MinStack对象,该对象包含两个列表:self.stack用于保存栈中的元素,self.minstack用于保存辅助栈中的元素。
    • push函数:将传入的x压入self.stack列表中。如果self.minstack为空,则直接将x压入self.minstack中;否则,比较x和self.minstack中的栈顶元素(即当前栈的最小值),将较小值压入self.minstack中。
    • pop函数:将self.stack中的栈顶元素弹出。如果弹出的元素恰好是self.minstack中的栈顶元素,说明该元素是当前栈中的最小值,需要将其从self.minstack中弹出。
    • top函数:返回self.stack中的栈顶元素。
    • min函数:返回self.minstack中的栈顶元素,即为当前栈中的最小值。

    需要注意的是,该类中的push、pop、top和min函数的时间复杂度均为O(1),符合题目要求。

minbag(n)函数是一个递归函数,在袋子只能装2、3或5件物品的情况下,计算出装n件物品的最小袋子数。
首先检查n是否大于1,如果是,该函数检查n是否等于2、3或5。如果n等于这些值中的任何一个,那么只需要一个袋子,所以函数返回1。
接下来就是递归调用,minbag(n-2) 就相当于是用一个袋子装 2 件物品,然后看剩下的 n-2 个物品最少要用多少袋子,n-3 和 n-5 也是一样的道理,先用一个袋子装 3 或 5 件物品,然后看剩下的 n-3 或 n-3 件物品最少要用多少袋子。
举个例子,n=7
首先是 smallest = minbag(7-2),也就是说,7 个物品里,用 1 个袋子装 2 件物品,然后看剩下的 5 件物品最少要用多少袋子,然后继续递归;
然后再是 smallest = min(smallest, minbag(7-3)),7 个物品里,用 1 个袋子装 3 件物品,然后看剩下的 4 件物品最少要用多少袋子,然后继续递归;
minbag(7-5) 同理。