为了账号安全,请及时绑定邮箱和手机立即绑定

返回错误结果的序列的递归求和

返回错误结果的序列的递归求和

HUWWW 2021-12-26 15:26:59
我试图检索一个等差数列的前 n 项a(n) = n(n-1) + 4 where n(1) = 5 的总和:因此,前 2 项 (5,9) 的总和将是 14。但是,我的代码没有返回这个。相反,我得到了 13。我错过了什么?def main():    sequence(3,0)    print("in main")# 5,9,13,17,21,...# Sum of first 2 = 14# Sum of first 3 = 27def sequence(n, sum):    if (n == 1):        return 5    else:        a = sequence(n-1, sum) + 4        sum += a        print(sum)        return aif __name__ == '__main__':     try:        main()    finally:        print("done")
查看完整描述

3 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

一个等差数列(或级数)具有:

  • 一个给定的开始词语:让我们把它˚F IRST

  • 增量值(任何连续2个词之间):让我们把它 d IFF

是一组有序的数字(项),其中每个项可以写为:

Tk = Tk - 1 + d,从这里开始:

Tk = T1 + (k - 1) * d(虽然我发现它有点不自然,Ť 1为第1的元素,所以从索引开始1中,为了使Ñ序列中元件具有索引Ñ(0)

所以:

T1 = f

T2 = f + (2 - 1) * d( )T1 + d

T3 = f + (3 - 1) * d( )T2 + d

T4 = f + (4 - 1) * d

....

Tn - 1 = f + (n - 2) * d

Tn = f + (n - 1) * d

总结所有内容,在=符号的右侧

  • f出现n

  • d出现(n - 1) + (n - 2) + ... + 2 + 1,它是数字 til n - 1的总和,可以使用高斯公式计算:(n - 1) * n // 2

  • 对于这种特殊情况,f = 5d = 4

所以,使用这个等差数列属性,你不需要计算每一项,因此完全不需要递归,相反你可以(应该)使用一堆简单的算术运算。

有关更多详细信息,请查看[维基百科]:算术级数

翻译成Python

>>> def sum_arithmetic_sequence(first, diff, count):

...     return count * first + ((count - 1) * count // 2) * diff

...

>>>

>>> sum_arithmetic_sequence(5, 4, 1)

5

>>> sum_arithmetic_sequence(5, 4, 2)

14

>>> sum_arithmetic_sequence(5, 4, 3)

27

>>> sum_arithmetic_sequence(5, 4, 4)

44

或(来自(0)):


>>> def sequence_sum(n):  # I'd add the first and diff arguments as well to keep it general, but for simplicity's sake I'll hardcode them to 5 and 4

...     if n == 1:

...         return 5

...     return 5 + (n - 1) * 4 + sequence_sum(n - 1)

...

>>>


查看完整回答
反对 回复 2021-12-26
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

你应该试着分解它来理解它。


sequence(3, 0)


# first iteration

a = sequence(2, 0) + 4

# second iteration

a = sequence(1, 0) + 4

# third iteration

return 5


# Now let's work our way backwards


a = 5 + 4 -> 9

a = 9 + 4 -> 13

这就是为什么你会得到 13。这是否足以让你朝着正确的方向前进?这是另一个提示,请注意您正在返回数字序列而不是它们的总和。


查看完整回答
反对 回复 2021-12-26
?
POPMUISE

TA贡献1765条经验 获得超5个赞

您的问题中似乎至少有几个令人困惑的问题。首先,您将序列公式表示为:


a(n) = n(n-1) + 4

但要获得您所描述的结果,公式必须是:


a(n) = a(n-1) + 4

其次,您似乎将序列与序列的总和混淆了。让我们生成序列(递归),然后对序列进行运行求和(也递归):


def sum_sequence(sequence):


    first, rest = sequence[0], sequence[1:]


    if rest:

        second, rest = rest[0], rest[1:]

        rest = sum_sequence([first + second] + rest)


    return [first] + rest


def generate_sequence(n):

    if n == 1:

        return 5


    return generate_sequence(n - 1) + 4


if __name__ == '__main__':


    sequence = [generate_sequence(n) for n in range(1, 11)]


    print(*sequence, sep=", ", end=", ...\n")


    sums = sum_sequence(sequence)


    print(*sums, sep=", ", end=", ...\n")

输出


% python3 test.py

5, 9, 13, 17, 21, 25, 29, 33, 37, 41, ...

5, 14, 27, 44, 65, 90, 119, 152, 189, 230, ...

%


查看完整回答
反对 回复 2021-12-26
  • 3 回答
  • 0 关注
  • 247 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号