【问题标题】:Gaussian Addition - Python Challenge高斯加法 - Python 挑战
【发布时间】:2022-07-06 06:12:38
【问题描述】:

我目前正在处理一些初学者的 Python 挑战,我刚刚完成了一个高斯加法挑战。我能够得到挑战正在寻找的输出,但似乎我把事情复杂化了。

挑战如下:

编写一个将数字列表传递给函数的程序。

  • 该函数应使用 while 循环来不断弹出列表中的第一个和最后一个数字并计算这两个数字的总和。
  • 该函数应打印出当前相加的数字,并打印它们的部分总和。
  • 该函数应跟踪有多少部分和。
  • 然后该函数应打印出有多少部分和。
  • 该函数应执行高斯乘法,并报告最终答案。
  • 通过传入范围 1-100 并验证您得到 5050 来证明您的函数有效。 gauss_addition(list(range(1,101)))
  • 您的函数应该适用于任何一组连续数字,只要该组的长度是偶数即可。
  • 奖励:修改您的函数,使其适用于任何一组连续数字,无论该组的长度是偶数还是奇数。

我的功能如下:

def gauss(numbers):
    for number in numbers:
        while len(numbers) > 0:
            num1 = numbers.pop(0)
            print(num1)
            num2 = numbers.pop(-1)
            print(num2)
            calc = num1 + num2
            print(str(num1) + " + " + str(num2) + " = " + str(calc))
    print("Final answer is: " + str(num1 * calc))
    
           
gauss(list(range(1,101)))

谁能解释我如何在不使用 python 模块的情况下简化这个功能?我了解我编写的函数是如何工作的,但我也想知道是否有更简单、“更简洁”的方式来实现这一点。

我应该指定我只知道python的基础知识......

【问题讨论】:

  • 如果您的代码有效并寻求改进意见 - 建议去这里codereview.stackexchange.com
  • 是否可以将我的问题转移到该站点而无需在代码审查中打开新问题?
  • 这个问题似乎与 interleaving 一个列表(然后求和)有关,如果是这样,您不必重复执行pop - 这很昂贵。跨度>
  • 有趣...虽然,挑战主要集中在使用 while 循环。
  • pop 是 O(1) 来弹出 Python 列表的最后一个元素,并且 O(N) 来弹出任意元素(因为列表的整个其余部分必须转移)。

标签: python


【解决方案1】:

使用列表来解决这个问题似乎太昂贵了,因为重复pop会像早期笔记中提到的那样代价高昂。

因此,您可以考虑使用集合模块 deque 来代替它,这将允许您有效地在两端进行操作(pop)。

所以解决办法是这样的:

#
from collections import deque

dq = deque(range(1, 101))  # create a list (dq list)

total = 0
count = 0

while dq:
    x, y = dq.popleft(), dq.pop()
    print(x, y, x+y, end='\t')
    count +=  1       # how many partial sum?
    print(count)
    total += (x+y)


print(f' final total: {total} ')

输出:(部分 - 太长了)

1 100 101   1
2 99 101    2
3 98 101    3
4 97 101    4
5 96 101    5
...........
...........
48 53 101   48
49 52 101   49
50 51 101   50
final total: 5050 

【讨论】: