Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1631192
  • 博文数量: 1481
  • 博客积分: 26784
  • 博客等级: 上将
  • 技术积分: 17045
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-12 09:22
文章分类

全部博文(1481)

文章存档

2014年(10)

2013年(353)

2012年(700)

2011年(418)

分类: 系统运维

2011-09-13 09:49:10

考试了,其中有一道题是关于递归函数的,我卡到那了,当时考完的时候我突然想起我曾经也拜倒在它的脚下,那次是高中。

高中的时候就出现很多递归函数,应该是在“级数”那里的习题中出现的,而且还不少。还是从例子开始吧:

f(x)=f(x-1)+x*x ,其中x>0f(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>0f(0)=0 就是一个递归函数,它用到了f(x)是用f(x-1)定义的。细心的人还可以发现x>0f(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>0f(0)=0)的。

现在在来写一个正整数nn! 的递归函数就思路很明确了。
分析:正整数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.'
';

}
由此我们可以发现当要写一个递归函数,找到终止条件,一个递归函数就很明朗了,剩下就是语法问题了。

注:手边没有参考书,直接写的例子,里面的专用名词也是自己命名的,有不严谨的地方的话,请见谅。

原文地址:

阅读(327) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~