详解python中的迭代与递归方法
遇到一个情况,需要进行递归操作,但是呢递归次数非常大,有一万多次。先不说一万多次递归,原来的测试代码是java的,没装jdk和编译环境,还是用python吧
先看下原本的java代码:
public class UpCount { private long calc(int depth) { if (depth == 0) return 1; long cc = calc(depth - 1); return cc + (depth % 7) + ((((cc ^ depth) % 4) == 0) ? 1 : 0); } public static void main(String[] args) { UpCount uc = new UpCount(); System.out.println(uc.calc(11589)); } }
java没怎么玩过,但是这几行代码看过来还是没压力的,快刀斩乱麻改为对于python代码
def calc(depth): if depth == 0: return 1 cc = long(calc(depth-1)) xor_mod = (cc ^ depth)%4 if xor_mod == 0: return cc+(depth%7)+1 else: return cc+(depth%7) number = long(calc(11589)) print number
代码粘上去,F5,出错了
这个版本的代码本来是没有加long的,因为之前一串十几位的整数直接拿来就可以用,所以怀疑跟long是不是有关系
当然啦,事实上这里跟long完全没关系,python支持的整数长度可是非常长的,参考之前写的代码如下:
cimal = 7 original = 28679718602997181072337614380936720482949 array = "" result= "" while original !=0: remainder = original % cimal array += str(remainder) original /= cimal length = len(array) for i in xrange(0,length): result += array[length-1-i] print result
上面这段代码将一串很长的十进制数字转为7进制表示,也可以转为任意进制,换做是8进制和16进制,一个oct(),hex()就搞定了,用辗转相除法来解决吧
因此,可以看出来,出错不在于数的大小,毕竟11589对现在的计算机来说只是小菜,2^16还有65536呢
其实到这里才发现,没有说前面递归报错的真正原因,憔悴了
递归出错的原因是因为python默认的递归限制只有1000次左右,但是这里却要运行10000+,刷了半天:RuntimeError: maximum recursion depth exceeded
于是赶紧查了下,发现可以自己设置递归的限制,见python中递归的最大次数,作为延伸也可以查看官网文档
总的说来就是,为了防止益处和崩溃,python语言默认对次数加了限制,那么我改了这个限制是不是就ok了呢
import sys
# set the maximun depth as 20000
sys.setrecursionlimit(20000)
插入上面代码,果断改20000,这下没这限制应该没问题了,但是结果却大跌眼镜,什么都没输出来,不解了
没有继续查了,问了下小伙伴littlehann,讨论了下, 没有对这个问题深究下去。而是提到递归这种运算在实际应用中的效率,确实除了课本上很少看到使用递归的
本来的目的就只是求值,没想对它深究下去,还是改用迭代吧,虽然没太大印象了,不过一个for语句据可以搞定了
代码如下:
def calc(depth): tmp = 0 result = 1 for i in xrange(0,depth+1): cc = result if (cc ^ i)%4 == 0: tmp = 1 else: tmp = 0 result = result + (i)%7 + tmp return result final = calc(11589) print final
短短几行代码,一下子搞定了。想到上次面试的时候,tx的面试官问我算法,当时提到了用递归实现一个运算,再想想是不是也可以用迭代呢?
时间过去很久了,当时的题目也记不太清楚了,但是今天的教训是:大多数(代码写得少,凭感觉说的估计值)情况下,递归的效率是比较低下的,这一点可以确定,上课的
时候也有讲到过。使用迭代的效率明显要高过递归(迭代的具体概念记不太清楚了),起码用循环,运算几十万次我可以肯定没问题,但是即便我改了递归限制,还是遇到了罢工
最后,再贴出一个python long VS C long long的链接,感兴趣的可以去看看
以上是详解python中的迭代与递归方法的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP适合网页开发和快速原型开发,Python适用于数据科学和机器学习。1.PHP用于动态网页开发,语法简单,适合快速开发。2.Python语法简洁,适用于多领域,库生态系统强大。

在 Sublime Text 中运行 Python 代码,需先安装 Python 插件,再创建 .py 文件并编写代码,最后按 Ctrl B 运行代码,输出会在控制台中显示。

PHP起源于1994年,由RasmusLerdorf开发,最初用于跟踪网站访问者,逐渐演变为服务器端脚本语言,广泛应用于网页开发。Python由GuidovanRossum于1980年代末开发,1991年首次发布,强调代码可读性和简洁性,适用于科学计算、数据分析等领域。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

Golang在性能和可扩展性方面优于Python。1)Golang的编译型特性和高效并发模型使其在高并发场景下表现出色。2)Python作为解释型语言,执行速度较慢,但通过工具如Cython可优化性能。

在 Visual Studio Code(VSCode)中编写代码简单易行,只需安装 VSCode、创建项目、选择语言、创建文件、编写代码、保存并运行即可。VSCode 的优点包括跨平台、免费开源、强大功能、扩展丰富,以及轻量快速。

在 Notepad 中运行 Python 代码需要安装 Python 可执行文件和 NppExec 插件。安装 Python 并为其添加 PATH 后,在 NppExec 插件中配置命令为“python”、参数为“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通过快捷键“F6”运行 Python 代码。
