简单理解:
其实平时我们熟悉的很多数学函数都是可以由一个简单的公式搞定.比如将由华氏温度转变为摄氏温度:
C=5*(F-32)/9
相信有简单C语言基础都可以很简单的完成这个公式,除去程序中的说明注释以及大括号外就只是一行C程序代码.这是比较标准的函数,很多时候我们碰到的函数是不太标准,比如说
我们在非负整数集定义函数F:
它满足F(0)=0且
F(X)=2*F(X-1)+X^2.
则F(1)=1,F(2)=6,F(3)=21,F(4)=58.当一个函数用他自己来定义时就称为递归.
(1) 首先,递归有一个基本情况比如上面F(0)=0,这是一个直接算出不用求助于递归.上面F(X)=2*F(X-1)+X^2如果没有F(0)=0,这个函数就是没有意义的,你必须总要有一些不用递归就能求解.
(2) 然后要有不断推进的过程,递归调用必须向能产生基本情况的方向进行.
举一个例子,想想你遇到一个陌生单词,现在你有一本大英语词典,上面所有的词语都是英文.当我们查一个单词时,我们对词典给出的解释又有不认识的,我们就不得不去查这个不认识的,这个不认识的词的解释中我们又有不知道的,就不断去查只要这个词典是正确的我们总会查完的.因为词典是有限的,所以到最后有两种情况,要不明白这个词语,要不我们就会一直循环下去无法明白其中的意思,或者在解释中我们需要理解的某个单词的解释就不在这本词典中.
(3) 设计法则.假设所有递归调用都能用,这事很重要的,因为它意味着当设计递归时不必试图去追踪大量递归调用.在实际使用中追踪递归调用序列是很难的,不过对于电脑就能算出复杂的细节.
(4) 合成效益法则.再求解一个问题的实例时,切勿在不同的递归调用中做重复性工作,比如用递归来计算斐波那这类的简单数学函数的值的想法就不是一个很好的想法.
(1)(2)来源于书上的,(3)(4)来源于网上的,全是个人整理,如有不足,多指教.