分类: 系统运维
2011-09-13 09:49:10
考试了,其中有一道题是关于递归函数的,我卡到那了,当时考完的时候我突然想起我曾经也拜倒在它的脚下,那次是高中。
高中的时候就出现很多递归函数,应该是在“级数”那里的习题中出现的,而且还不少。还是从例子开始吧:
f(x)=f(x-1)+x*x ,其中x>0且f(0)=0 求f(4)
解: 由于f(0)=0:
当x=1 时
f(1)=f(0)+1*1=1;
当x=2
时 f(2)=f(1)+2*2=5;
当x=3 时 f(3)=f(2)+3*3=14;
当x=4 时 f(4)=f(3)+4*4=30;
所以, f(4)=30.
上学的时候,可能会这样做出来。
f(x)=f(x-1)+x*x ,其中x>0且f(0)=0 就是一个递归函数,它用到了f(x)是用f(x-1)定义的。细心的人还可以发现x>0且f(0)=0也是函数的一部分:
x>0提供一个递归区间,而f(0)=0提供了一个初始条件(思维方向不同,在电脑思维中这个条件为终止条件,详见下文)。
或许大家觉得和我们课堂上的递归还是有点不同,不同在哪呢?
这就是人脑和电脑的区别:
电脑不会直接去找初始条件去向问题递推。
而是从问题出发,递推下去,直到找到终止条件(解题时的初始条件)。
电脑思维:
f(4)=f(3)+4*4;
f(3)=f(2)+3*3
f(2)=f(1)+2*2
f(1)=f(0)+1*1
f(0)=0; //终止条件
f(1)=f(0)+1*1=1;
f(2)=f(1)+2*2=5;
f(3)=f(2)+3*3=14;
f(4)=f(3)+4*4=30;
这个是电脑的思维过程,也就是计算过程,不会在前台显示出来。
“遇到问题,解决问题,输出结果”——这是电脑处理问题的流程。
关键在于,怎么写个递归函数让电脑认识。
明白递归函数的定义,其实很简单。
递归函数有三个充分条件:第一是函数体,第二是递归区间,第三个是终止条件,
只要在代码中全部申明出来,一个递归函数的就写出来了。
上面的递归函数的就可以写出下面的代码:
function
squaresum($x){
if($x>0)
//递归区间
$result=squaresum($x-1)+$x*$x; //函数体
elseif($x=0) //终止条件
return $result=0;
return $result;
}
echo squaresum(4); //输出30
其中用到了if...elseif…语句,这就是来声明递归函数的递归区间和终止条件(x>0且f(0)=0)的。
现在在来写一个正整数n的n!
的递归函数就思路很明确了。
分析:正整数n , f(n)=n! =>
函数体:f(n)=n*f(n-1); 递归区间:n.>
1; 终止条件:n=1;
function rank($n){
if($n>1)
$result=$n*rank($n-1);
elseif($n=1)
return $result=1;
return
$result.'
';
}
由此我们可以发现当要写一个递归函数,找到终止条件,一个递归函数就很明朗了,剩下就是语法问题了。
注:手边没有参考书,直接写的例子,里面的专用名词也是自己命名的,有不严谨的地方的话,请见谅。
原文地址: