惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
H
Heimdal Security Blog
K
Kaspersky official blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
S
Schneier on Security
G
GRAHAM CLULEY
U
Unit 42
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
C
CERT Recently Published Vulnerability Notes
Google DeepMind News
Google DeepMind News
罗磊的独立博客
Stack Overflow Blog
Stack Overflow Blog
阮一峰的网络日志
阮一峰的网络日志
Simon Willison's Weblog
Simon Willison's Weblog
C
Cisco Blogs
Cyberwarzone
Cyberwarzone
T
The Exploit Database - CXSecurity.com
Project Zero
Project Zero
Security Archives - TechRepublic
Security Archives - TechRepublic
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 司徒正美
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
V
Visual Studio Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
Jina AI
Jina AI
P
Proofpoint News Feed
P
Proofpoint News Feed
有赞技术团队
有赞技术团队
L
LINUX DO - 最新话题
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 聂微东
T
The Blog of Author Tim Ferriss
Spread Privacy
Spread Privacy
Application and Cybersecurity Blog
Application and Cybersecurity Blog
IT之家
IT之家
S
Security Affairs
博客园 - 叶小钗
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
N
News | PayPal Newsroom
Cloudbric
Cloudbric
AWS News Blog
AWS News Blog
W
WeLiveSecurity
The Last Watchdog
The Last Watchdog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
NISL@THU
NISL@THU

博客园 - cobbles

基本查找算法 位、字节、字长、频率、时钟周期、带宽 缓冲区 套接字同步与异步 原码、补码和反码 confluence [转]Groovy和Grails简介 [转]关于BI的一个故事 参考书目 [网址]db2管理 [转]用于数据仓库的 DB2 产品 [转]把GridView的内容输出到Excel的两点注意 将DataGrid生成excel word 访问IIS元数据库失败 [转]用javascript判断窗口关闭事件 asp调用Web Service Typed Vs. Untyped DataSets Typed DataSets in .NET Database Normalization Basics
递归和迭代(Recursion and Iteration)
cobbles · 2008-10-10 · via 博客园 - cobbles

在处理一些复杂问题的时候,最常用到的两个方法是递归和叠代,它们直接利用计算机的高速计算能力解决问题。这两种方法都会把一个复杂的问题拆解成很小的,甚至更小的容易解决的步骤,但它们稍有不同。

在两者之中,叠代方法也许更简单一点。叠代方法会把问题分解成一串串行的子步骤,一个接一个的运行。例如,如果需要累加所有小于五的自然数,你需要从一开始(第一步),然后加二(第二步),然后加三(第三步)等等。在每一步中你加入不同的数字(加入的数字与步号相同)。这被称作“迭代遍历程序”(原文为iterating through the problem,译者注)。从一步到另一步的步号(原文为step number,译者注)中只有一部分被真正的改变了,因为你可以从步号中计算出所有其它的信息(比如你要累加的数字)。这就是迭代的关键:通过步号寻找其他的所有信息。迭代运用于语言的经典例子莫过于BASIC或C++中的条件循环(for loop,译者注)语句。

如果说迭代是逐个解决一大堆步骤的话,递归就是把所有步骤堆起来一次性解决。它像是用一个镜子对着另外一个镜子:每一个镜像都是与另外一个镜像差不多,但又完全不同的镜像。

最好用一个例子来解释。你怎么让计算机明白某个人是不是成吉思汗的后代呢?用算法来定义某个人是或者不是成吉思汗后代的方法就象这样:

这个人是成吉思汗的后代当且仅当他/她的父亲是成吉思汗,或者他/她的父亲或母亲是成吉思汗的后代。

等等,我们是不是违反了一个从小学起就耳熟能详的规则——不要用词(可能在这个例子中)来定义它自己呢?好的,在这里我们没有使用完整的循环逻辑,因为我们没有说“一个成吉思汗的后代是成吉思汗的后代”。让我们稍微扩展一下这个定义。

拿吉姆来说。尽管他并不知情,但它是成吉思汗的曾孙。因为吉姆的父亲不是成吉思汗,因此我们必须看看他的父亲是不是成吉思汗的后代......于是,我们又把这个定义再次套用在吉姆的父亲身上,就象我们对吉姆做的那样。吉姆的父亲的父亲(他的祖父)不是成吉思汗,于是我们又去看看他的父亲的父亲的父亲(他的曾祖父)。等等!它的曾祖父正是成吉思汗。那么,这意味着吉姆的祖父是成吉思汗的一个后代,也意味着他的父亲是成吉思汗的后代,也意味着他也是成吉思汗的后代。

你是否注意到,我们越来越深的陷入一个问题,用相同的方法套用直到我们达成某事,这件事情是全新的,那就是“终点”。之后,除非问题已经得到解决,否则我们沿着问题“展开”的次序最终返回问题的起点。这种类似“自复制”的递归技术还导致了一个程序员的笑话:

递归 /冒烟/:see 递归(此处是一个递归逻辑语句,大意是递归递归除非冒烟,原文为Recursion /ree—ker'—zhon/: See Recursion,译者注)

那么,现在大家可以看出递归与迭代两者的不同了。对于迭代来说,每一步都清晰无误的指导下一步,就象是踩着石头过河,但对递归来说,每一步都在一个更小的尺度上复制了自己,最终它们都结合在一起解决问题。完整的理解这两种方法至关重要,因为它们被用于几乎每一种计算机算法中。


 http://www.yeeyan.com/articles/view/14392/3982/dz