递归函数不返回我想要的

2024-06-16 11:52:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我要为一门课做一个练习,尤其是这门课对我不太管用。这个问题很简单,我有一个解决办法,但我不知道我是否被允许有多个功能,或如果我注定只有一个。我更喜欢只使用一个函数。你知道吗

我必须写一个简单的函数,以n层作为参数,并计算它总共有多少升汤(它必须是一个递归函数)。层是罐头的字面层,工作方式如下:顶层有1^2个罐头,第二层有2^2个,第三层有3^2个,依此类推。你知道吗

此函数可成功计算n层中的罐数:

def lager(n):
    if n<1:
        return 0
    else:
        return n**2+lager(n-1)

例如,函数返回n=2的示例5,以此类推。 一个罐子里有0.407150407905升汤,所以我应该把这个函数的结果乘以它,对吗?所以我想为什么我不能用同样的函数呢?我试着编辑最后一行:

return (n**2+lager(n-1))*0.407150407905 

但出于某种原因(我不明白),它不适用于层数大于1的情况。你知道吗

因为我没有让它工作,我只是让上面的函数保持原样,并制作了一个新的函数,它接受返回值并将其与0.407150707905相乘,然后打印结果。但正如我所说的,我不确定是否允许我写函数。有人能告诉我为什么我的理论行不通吗?你知道吗


Tags: 函数功能示例参数returnifdef方式
2条回答

每行nn**2罐,每罐容积0.407150407905升。但是,当前函数将volume乘法器应用于以下两个方面:

  • 当前水平的罐数;以及
  • 上一层罐的体积不是数量)。你知道吗

这意味着乘法器被反复应用到一些罐子上,有效地减少了它们在每一层上的体积。在这里我建议两种选择之一:

  1. 将其分为两个函数,其中一个函数给出罐头数量,另一个函数给出总体积;或者
  2. 移动倍增器,使其仅与当前级别的罐头相乘。你知道吗

因此:

def cans(layers):
    if layers < 1:
        return 0
    return (layers ** 2) + cans(layers-1)

def lager(layers=5, volume=0.407150407905):
    return cans(layers) * volume

或:

def lager(layers=5, volume=0.407150407905):
    if layers < 1:
        return 0
    return (volume * (layers ** 2)) + lager(layers-1)

您的方法不起作用,因为在递归计算中,因子0.407...用在了错误的位置。使用两个步骤的方法更清晰:首先计算罐的数量,然后将罐的数量乘以罐的容量。你知道吗

相关问题 更多 >