【问题标题】:Deal with extremely large numbers with Python Programming [closed]使用 Python 编程处理非常大的数字 [关闭]
【发布时间】: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


【解决方案1】:

没有什么可以使递归本质上更有效。此外,由于函数调用开销,使用递归实现的相同算法的效率可能较低。更糟糕的是,这正是你的情况,使用大深度的递归可能会导致堆栈溢出(不是双关语)。除非在使用尾递归优化,这在 Python 中是没有的。

Python 对整数大小没有任何限制(在合理范围内),这不是问题所在。使用循环重新实现该功能,您会做得很好。除了n ** n 并没有像你想象的那样做。

【讨论】:

  • @vish4071 试试看。
  • 对不起...我的坏@bereal
  • 哦是的........!!!谢谢@bereal你的天才
猜你喜欢
  • 1970-01-01
  • 2013-05-30
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 2019-12-14
相关资源
最近更新 更多