【发布时间】:2017-03-26 13:11:12
【问题描述】:
当我们谈论代码的复杂性时,大多数时候我们会考虑输入的数量。通常我们不会过多考虑底层硬件实现。为了获得代码复杂性和我们组成算法(代码)的输入数量之间的联系,我们通常使用 Big_O 表示法。循环是实现算法必不可少的东西,但它具有 O(n) 复杂度,这意味着时间将随着输入数量线性增长,因此大量输入效率低下。但是我们可以用递归替换循环,因为递归总是具有 O(log n) 时间复杂度。我不会在这里澄清它。从以上所有这些但我想说递归比循环更有效
还有任何可以做循环的事情,我们可以通过递归更有效地做同样的事情。
所以我从Project Euler.net 呼叫self powers 找到了一个问题
关注我的问题
系列,11 + 22 + 33 + ... + 1010 = 10405071317。 求系列的最后十位,11 + 22 + 33 + ... + 10001000。
这个问题似乎很简单,所以我用 Python 实现了我的代码,它 对于 small number 的数字范围 工作顺利,但获得了 1000 到 1000 的幂以及以上所有内容的总和python 通常会显示一个错误(因为数字非常大,足以在 python 的内存流中出现)所以我如何得到答案。下面是我的代码
def f(n):
if n==1:
return 1
else:
return n**n+f(n-1)
所以我的问题是我如何解决这个问题,以及如何处理那些非常大的数字,我如何管理那些会在大量整数上发生的异常,请提及好的动机算法?
【问题讨论】:
-
你在哪里找到这个“递归总是有 O(log n) 时间复杂度”?
-
@vish4071 递归的单一实现有 O(log n)
-
1. Recusion 并不总是具有
O(logn)时间复杂度。 2. 循环不一定有 O(n) 复杂度,例如这个:for(int i = 1; i < N; i *=2) -
为什么那些人专注于我的问题而不是给出答案
-
@Heathens “为什么那些人专注于我的问题而不是给出答案”因为 stackoverflow 不仅仅是一个您来获得答案的网站。它旨在归档问题和答案,以便有人问自己同样的问题可以找到已经存在的答案,并且随着时间的推移而得到改进。因此,“编辑”功能。但问题也必须具有良好的质量,才能有用。在您的问题中,您声称的事情要么是错误的,要么并不总是正确的,这可能会给读者带来错误的知识。
标签: python algorithm recursion