我遇到了一个问题:我需要使用此方案找到列表的平均值:
首先,我们找到平均两个元素,三个元素..... len(list)
元素,并使用平均值形成一个新列表。使用.pop()
并再次查找所有平均值。函数应在len(list) == 2
时停止。应该使用递归。
实施例:
列表:[-1, 4, 8, 1]
1步:
[-1, 4], [-1, 4, 8], [-1, 4, 8, 1]
[1.5, 3.66..., 3]
(平均值)[1.5, 3.66...], [1.5, 3.66..., 3]
[2.5833.., 7.222...]
(平均值)len(list) == 2
时,找到这两个元素的平均值。答案是2.652777
。
我应该写什么:
jada = []
while True:
print 'Lst elements:'
a = input()
if (a == ''):
break
jada.append(a)
print 'Lst is:' + str(Jada)
def keskmine(Jada):
for i in range(len(Jada) - 1):
...
jada.pop()
return keskmine(Jada)
实际上,这是家庭作业的一部分,但我不知道如何解决它。
答案 0 :(得分:3)
接受列表作为函数参数。如果列表中有一个项目,则返回该项目。从列表中创建两个迭代器。从其中一个列表中弹出一个项目,将它们压缩在一起,然后找到zip结果的平均值。递归。
答案 1 :(得分:2)
简而言之,您从数字列表中找到了“平均值”。
使用递归在这里会有所帮助。当“len(lst)== 1”时返回唯一的元素,否则,计算运行平均值并递归。
此作业分为两部分。首先,您需要将[-1,4,8,1]等列表转换为[1.5,3.66,3]等列表(查找运行平均值)。其次,您需要使用运行平均值的结果重复此过程,直到列表的长度为2(或1)。
您可以独立于第二个问题解决第一个问题(找到运行平均值)。找到运行平均值很简单,首先跟踪运行总和(例如,如果列表为[-1,4,8,1],运行总和为[-1,3,11,12])并划分每个元素通过各自的运行指数(即只需[1,2,3,4])得到[-1 / 1,3 / 2,11 / 3,12 / 4] = [-1,1.5,3.66,3] 。然后你可以丢弃第一个元素来获得[1.5,3.66,3]。
使用递归可以轻松解决第二个问题。递归只是另一种循环形式,所有递归代码都可以转换为常规for / while循环代码,所有循环代码都可以转换为递归代码。然而,一些问题在递归或循环中倾向于更“自然”的解决方案。在我看来,使用递归更自然地解决了第二个问题(重复运行平均值的过程)。假设你已经解决了第一个问题(找到了运行平均值),我们有一个函数runavg(lst)来解决第一个问题。我们想编写一个重复找到lst运行平均值的函数,或者在lst的长度为2时返回平均值。
答案 2 :(得分:0)
这也是使用python 3.x itertools.accumulate:
的机会来自docs:
>>> list(accumulate(8, 2, 50))
[8, 10, 60]
然后,你只需要将每个项目除以其索引增加1,消除第一个元素并重复直到完成
例如,这适用于任何长度的任何列表,在列表解析中执行上述大多数步骤:
>>> from itertools import accumulate
>>> a = [-1, 4, 8, 1]
>>> while len(a) > 1:
a = [item / (index + 1) for (index, item) in enumerate(accumulate(a)) if index > 0]
>>> print(a)
[2.6527777777777777]
答案 3 :(得分:0)
首先我会给你一个解释,然后是一些伪代码,你必须在Python中重写。主要思想是让一个函数调用自身,每次迭代都会传递一个较小的问题。在这种情况下,您希望将项目数减少1。
您可以为每次通话创建一个新列表,也可以根据需要重复使用相同的列表。在将列表传递给下一次迭代之前,您需要计算平均值,从而创建更短的列表。
我们的想法是,您将参数中的数字相加,然后将您目前添加的项目数除以列表中的相应索引。完成后,您可以弹出最后一项。
代码看起来像这样:(样本中的索引基于零)
average(list[])
if(list.length == 0) // Check input and handle errors
exit
if(list.length == 1) // Recursion should stop
return list[0] // The one item is it's own average!
// calculate the averages into the list in indices 0 to length - 2
list.pop() // remove the last value
return average(list) // the recursion happens here