我想知道如何递归地实现第二个函数。
def sum(x):
if x == 1:
return 1
else:
return sum(x-1) + x
def factorials(x):
list1 = []
for c in range(1, x+1):
list1.append(sum(c))
return list1
print(factorials(10))
在第一个函数中,您将n作为参数传递,并返回1 + 2 + 3 + ...+ n
在第二个函数中,你将返回一个n个和的列表,例如当你调用factorial(10)时,输出将是[1,3,6,10,15,21,28,36,45,55]。
我真实的的问题是,我想知道是否有一些方法来做第二个功能,在一个递归的方式。我正在努力在递归函数中使用列表追加。
7条答案
按热度按时间vs91vp4v1#
几个答案已经向您展示了如何通过调用自身和
sum
函数(也是误导性命名的)来让factorial
函数(名称错误)生成一个列表。但是还没有人注意到重复调用sum
(就像这个算法将要做的那样)是非常浪费的。您需要在factorial
递归的每一级上递归一个sum
调用链。相反,您应该重写
factorial
,以直接根据列表中以前的值计算最新的值(递归查找)!这就是它的样子:如果您 * 实际上 * 想要第一个
n
阶乘,而不是第一个n
三角形数,请将lst[-1]+n
替换为lst[-1]*n
。5us2dqdw2#
首先是观察:不要将函数命名为
sum
,因为这是python中的内置函数。解决方案是在递归函数的外部声明一个列表,你不需要
sum
或等效的函数:生成
[1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
。还要注意,这也是一个更python化的解决方案。lymnna713#
正如@SimonUnderwood在评论中指出的那样,这是计算三角数,而不是阶乘。这就是说,这里有一些代码:
诀窍是在每次递归调用中向列表中追加一个项。在本例中,我使用
sum
为当前数字创建一个新列表,并使用列表上的加法运算符将其与其下数字的列表合并。hgtggwj04#
因为你是在做累计求和(而不是实际的阶乘),你可以使用n(n+1)/2公式(或者你自己的sum()函数)来计算每一项:
或
或者,您可以将部分结果向下传递给递归,并在n达到零时将最终列表级联回返回堆栈。每个递归调用只需要使用最后一个值和当前长度来计算下一个要添加的条目:
另一种方法是向下传递一个计数器,该计数器增加到n沿着最后一个结果值,并将递归列表与新条目连接起来(可以使用计数器向前计算):
ewm0tg9j5#
您可以使用
scan
实现triangle
-fcy6dtqo6#
我修正了一些变量的命名以使其更清晰,并更改了一些条件,以便在
x <= 0
的情况下不会无限循环这个列表将按照从大到小的顺序排列,但是如果你愿意的话,它可以很容易地翻转。
dced5bon7#
如果我没有在开头提到递归函数在Python中性能严重不足,那将是我的失职。在编写Python时,应该尽可能避免递归解决方案,因为迭代实现几乎总是更快更便宜。
递归函数调用自身,返回递归case或base case。基本情况最终将冒泡并结束递归,生成最终值。
例如,考虑这个递归定义的阶乘函数:
在处理了一些边缘情况(n=0,n<0)之后,你还剩下两种情况:
如果你想要一个函数递归地计算其中的每一个,你可以做...