遇到一个情况,需要进行递归操作,但是呢递归次数非常大,有一万多次。先不说一万多次递归,原来的测试代码是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中的迭代与递归的更多相关文章

  1. Python中可迭代对象是什么?

    Python中可迭代对象(Iterable)并不是指某种具体的数据类型,它是指存储了元素的一个容器对象,且容器中的元素可以通过__iter__( )方法或__getitem__( )方法访问. __i ...

  2. Python中的迭代是什么意思?

    Python中的迭代是指通过重复执行的代码处理相似的数据集的过程,并且本次迭代的处理数据要依赖上一次的结果继续往下做,上一次产生的结果为下一次产生结果的初始状态,如果中途有任何停顿,都不能算是迭代. ...

  3. python中的迭代、生成器等等

    本人对编程语言实在是一窍不通啊...今天看了廖雪峰老师的关于迭代,迭代器,生成器,递归等等,word天,这都什么跟什么啊... 1.关于迭代 如果给定一个list或tuple,我们可以通过for循环来 ...

  4. python中的迭代

    #迭代Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上. #list这种数据类型虽然有下标,但很多其他数据类型是没有下标的,但是,只要是可迭代对象,无论有无下标 ...

  5. Python学习-40.Python中的迭代

    在上一篇中,我们使用了生成器来创建了一个可遍历的对象.在其中,我们使用了yield关键字. Python我也正在学习中,因此对yield的本质我并不熟悉,但是,在C#中,yield关键字则是语法糖,其 ...

  6. python中可迭代对象、迭代器、生成器

    可迭代对象 关注公众号"轻松学编程"了解更多. 1.列表生成式 list = [result for x in range(m, n)] g1 = (i for i in rang ...

  7. Python中的迭代和可迭代对象

    什么是迭代(iteration)呢? 给定一个list或者tuple,通过for循环来遍历这个list或者tuple.这种遍历就是迭代(iteration).只要是可迭代的对象都可以进行迭代.怎么判断 ...

  8. 深入理解python中可迭代对象,迭代器,生成器

    英文原文出处:Iterables vs. Iterators vs. Generators 在python学习中,通常会陷入对以下几个相关概念之间的确切差异的困惑中: a container(容器) ...

  9. 第4.3节 Python中与迭代相关的函数

    下面要介绍的enumerate.range.zip.reversed.sorted属于Python内置的函数或者类别,返回的对象都可通过迭代方法访问. 一.    enumerate函数 1.     ...

随机推荐

  1. [转载]TFS发送邮件提醒功能

    第一次使用TFS 2010,发现有Project Alerts功能,就是项目组工程中若有任何改动时,TFS Server会自动发邮件提醒.Microsoft提供的配置方法(http://msdn.mi ...

  2. 机器学习&数据挖掘笔记_15(关于凸优化的一些简单概念)

    没有系统学过数学优化,但是机器学习中又常用到这些工具和技巧,机器学习中最常见的优化当属凸优化了,这些可以参考Ng的教学资料:http://cs229.stanford.edu/section/cs22 ...

  3. Clank – 快速构建移动 APP 原型的 HTML/CSS 框架

    Clank 是一个自由和开放源码的 HTML/CSS 框架,可以帮助你轻松创建本地手机或平板电脑应用程序的原型.它着重于提供一致的用户界面,不会刻意去模仿一个特定的 OS .该框架是基于组件的,这样我 ...

  4. Android聚合广告AFP的对接系统设计

    工作需要,要对接阿里妈妈的广告聚合平台,简称AFP.对于一般的应用而言,想要流量变现,广告是显而易见的手段,尤其是在中国,打开一个千万级别的用户,肯定有某个地方是有对接广告的,只不过明不明显而已. 阿 ...

  5. QT学习笔记3

    对话框 新建了一个对话框,在新建项目选择类型时是Dialog即可. 添加的代码如下,注意QCheckBox 并没有添加头文件定义,只是加了类的前向声明.因为我们仅仅使用的是指针,并不涉及到这些类的函数 ...

  6. HT for Web基础动画介绍

    在上一篇<基于HT for Web矢量实现3D叶轮旋转>一文中,我略微提了下HT for Web基础动画的相关用法,但是讲得不深入,今天就来和大家分享下HT for Web基础动画的相关介 ...

  7. 关于HttpHandler的相关知识总结

    一.关于IHttpHandler.IsReusable 很多人不明白,这哥们到底干嘛的,估计是微软最初的一个想法--让一个对象可以一直不断地被重复使用 ,但这个想法不成熟,会带来很多隐藏问题,一个对象 ...

  8. cdh完美集成kafka

    前言 其实cloudera已经做了这个事了,只是把kafka的包和cdh的parcel包分离了,只要我们把分离开的kafka的服务描述jar包和服务parcel包下载了,就可以实现完美集成了. 具体实 ...

  9. MyKTV

    namespace MyKTVClient{ public partial class FrmOrderBySinger : Form { private string singerSex = &qu ...

  10. [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 为什么要造轮子 同学们可以去各大招聘网站查看一下爬虫工程师的要求,大多是招JA ...