递归函数不返回我想要的

时间:2014-05-25 12:30:58

标签: python function recursion

我必须为一门课程做一个练习,特别是这个练习并不适合我。问题很简单,我有一个解决方法,但我不确定我是否可以拥有多个功能,或者我是否只想拥有一个功能。我希望这只能使用一个函数。

我必须编写一个简单的函数,它将n个图层作为参数并计算总共多少升汤(它必须是一个递归函数)。这些层是罐子的文字层,工作方式如下:顶层有1 ^ 2罐,第二层有2 ^ 2,第三层有3 ^ 2,依此类推。

这是成功计算n层中罐数的函数:

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

该函数返回例如5,其中n = 2,依此类推。 一个人可以包含0.407150407905升的汤,所以我应该将这个函数的结果与那个相加?所以我想为什么我不能在同一个功能中做到这一点?我尝试将最后一行编辑为:

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

但由于某些原因(我不明白),它不适用于大于1的图层数。

因为我没有让它工作,所以我只是保留了上面的函数并创建了一个新函数,它获取返回值并将其乘以0.407150407905并打印结果。但正如我所说,我不确定我是否被允许写入函数。有人能告诉我为什么我的理论不起作用吗?

2 个答案:

答案 0 :(得分:3)

在每行n中,您有n**2个罐,每个卷0.407150407905升。但是,您当前的函数会将volume乘数应用于:

  • 当前级别的罐数;和
  • 上一级别的音量号码)。

这意味着乘数被重复应用于某些罐头,有效地减少了每个级别的容量。我建议在这两个选择中选择一个:

  1. 将其拆分为两个功能,其中一个给你罐头数量,另一个给你总量;或
  2. 移动乘数,使其仅乘以当前级别的罐子
  3. 因此:

    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)
    

答案 1 :(得分:0)

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