php笔记6-函数和递归,递推
2016-06-05 21:49
585 查看
function f1($x, $y){
$re = $x + $y;
return $re;
}
$x = 1;
$v1 = f1($x, 2);
函数基础
函数的定义:
function 函数名 (形参1,形参2, .... ){
//形参就是“变量名”;
//。。。。。
}
函数的调用:
函数名(实参1,实参2, .... );
//实参就是“数据值”;
则调用函数,实际最开始发生的事情是:将实参的数据值,传递形参的变量名;
函数调用详细过程:
1, 首先,将实参的数据值,传递形参的变量名
2,程序执行流程进入函数内部开始执行;
3,函数执行结束,就返回到“调用位置”;
3.1:如果函数内部碰到return语句,则也同样立即返回“调用位置”;
函数的参数问题
函数形参的默认值问题
function 函数名 (形参1,形参2=值){。。。};
形参的传值问题
形参,默认情况下都是使用值传递;
但:
使用“&”来修饰一个形参时,就可以实现“引用传递”
此时,对应实参就要求必须是“变量”;
function 函数名 (形参1,&形参2, .... ){。。。}
函数参数的数量问题:
可以定义不定个数形参的函数,只要在函数内部使用如下3个“系统函数”来确定实参:
func_get_args(); //返回所有实参(结果是一个数组)
func_get_arg($i); //返回第i个实参(i从0开始算起);
func_num_args(); //返回实参的个数;
函数的返回值问题:
function 函数名(){
。。。。。
return XX数据值;
}
当一个函数有返回值时:函数调用语句就应该当做一个“值”(数据)去使用;
类比:一个变量的作为取值的使用场合有:
$s = $v1; //取得v1的值,并赋值给s
$s = $v1 + 3 ; //取得v1的值,并进行计算
echo $v1; //取得v1的值,并输出;
echo $v1 + 3; //取得v1的值,并进行计算
func1(1, 2, $v1); //取得v1的值,并作为函数调用的实参
则,一个有返回值的函数调用语句,跟上述变量的使用几乎一样!
我们假设函数调用语句为f1(1,2) ,则示例如下:
$s = f1(1,2); //取得f1的返回值,并赋值给s
$s = f1(1,2) + 3 ; //取得f1的返回值,并进行计算
echo f1(1,2); //取得f1的返回值,并输出;
echo f1(1,2)+ 3; //取得f1的返回值,并进行计算
func1(1, 2, f1(1,2)); //取得f1的返回值,并作为函数调用的实参
但:如果一个函数没有返回值,则其调用形式,几乎只有一种情况(假设为f2):
f2(11,22); //那就是成为一条独立语句!
函数的其他形式:
可变函数:就是使用一个变量来代表函数名;
$s = “f1”; //一个字符串而已;
$s(); //其实是在调用函数f1——当然,前提是有该函数;
匿名函数:
形式1:
$f1 = function (形参.....){。。。。};
$f1(); //调用该匿名函数;
形式2:直接就当做“其他函数”的一个实参来使用,其调用是在“其他函数”内部进行。
func3(1, 2, function (形参.....){。。。。} ) ;
//这里其实是调用函数func3
变量的作用域问题
3个作用域,对应3种范围的变量:
局部作用域:局部变量;
全局作用域:全局变量;
超全局作用域:超全局变量;
如果在局部作用域使用(访问)全局变量?(常见需求)
$v1 = 1;
$v2 = 2;
function f1(){
global $v1;
echo $v1; //输出1;
echo $GLOBALS[‘v2’]; //输出2
}
有关函数的系统函数:
fuction_exitst(“函数名”); //判断该函数是否被定义过了(是否存在);
有关函数的编程思想
递归思想——递归函数:
代码模式:
function f1($n){
if($n == 最小级){
return 已知的值;
}
$result = 对 f1( $n-1) 进行一个简单计算;
return $result;
}
递推(迭代)思想
$qian = 已知的值; //通常就是指最小级的数据值,是已知的;
for($i = 最小级的下一级, $i <= 目标级数; ++$i){
$result = 对 $qian 进行一个简单计算;
$qian = $result; //将当前求得的结果值,当做“要求的下一级的”前一个值;
}
最后$result 就是结果;
$re = $x + $y;
return $re;
}
$x = 1;
$v1 = f1($x, 2);
函数基础
函数的定义:
function 函数名 (形参1,形参2, .... ){
//形参就是“变量名”;
//。。。。。
}
函数的调用:
函数名(实参1,实参2, .... );
//实参就是“数据值”;
则调用函数,实际最开始发生的事情是:将实参的数据值,传递形参的变量名;
函数调用详细过程:
1, 首先,将实参的数据值,传递形参的变量名
2,程序执行流程进入函数内部开始执行;
3,函数执行结束,就返回到“调用位置”;
3.1:如果函数内部碰到return语句,则也同样立即返回“调用位置”;
函数的参数问题
函数形参的默认值问题
function 函数名 (形参1,形参2=值){。。。};
形参的传值问题
形参,默认情况下都是使用值传递;
但:
使用“&”来修饰一个形参时,就可以实现“引用传递”
此时,对应实参就要求必须是“变量”;
function 函数名 (形参1,&形参2, .... ){。。。}
函数参数的数量问题:
可以定义不定个数形参的函数,只要在函数内部使用如下3个“系统函数”来确定实参:
func_get_args(); //返回所有实参(结果是一个数组)
func_get_arg($i); //返回第i个实参(i从0开始算起);
func_num_args(); //返回实参的个数;
函数的返回值问题:
function 函数名(){
。。。。。
return XX数据值;
}
当一个函数有返回值时:函数调用语句就应该当做一个“值”(数据)去使用;
类比:一个变量的作为取值的使用场合有:
$s = $v1; //取得v1的值,并赋值给s
$s = $v1 + 3 ; //取得v1的值,并进行计算
echo $v1; //取得v1的值,并输出;
echo $v1 + 3; //取得v1的值,并进行计算
func1(1, 2, $v1); //取得v1的值,并作为函数调用的实参
则,一个有返回值的函数调用语句,跟上述变量的使用几乎一样!
我们假设函数调用语句为f1(1,2) ,则示例如下:
$s = f1(1,2); //取得f1的返回值,并赋值给s
$s = f1(1,2) + 3 ; //取得f1的返回值,并进行计算
echo f1(1,2); //取得f1的返回值,并输出;
echo f1(1,2)+ 3; //取得f1的返回值,并进行计算
func1(1, 2, f1(1,2)); //取得f1的返回值,并作为函数调用的实参
但:如果一个函数没有返回值,则其调用形式,几乎只有一种情况(假设为f2):
f2(11,22); //那就是成为一条独立语句!
函数的其他形式:
可变函数:就是使用一个变量来代表函数名;
$s = “f1”; //一个字符串而已;
$s(); //其实是在调用函数f1——当然,前提是有该函数;
匿名函数:
形式1:
$f1 = function (形参.....){。。。。};
$f1(); //调用该匿名函数;
形式2:直接就当做“其他函数”的一个实参来使用,其调用是在“其他函数”内部进行。
func3(1, 2, function (形参.....){。。。。} ) ;
//这里其实是调用函数func3
变量的作用域问题
3个作用域,对应3种范围的变量:
局部作用域:局部变量;
全局作用域:全局变量;
超全局作用域:超全局变量;
如果在局部作用域使用(访问)全局变量?(常见需求)
$v1 = 1;
$v2 = 2;
function f1(){
global $v1;
echo $v1; //输出1;
echo $GLOBALS[‘v2’]; //输出2
}
有关函数的系统函数:
fuction_exitst(“函数名”); //判断该函数是否被定义过了(是否存在);
有关函数的编程思想
递归思想——递归函数:
代码模式:
function f1($n){
if($n == 最小级){
return 已知的值;
}
$result = 对 f1( $n-1) 进行一个简单计算;
return $result;
}
递推(迭代)思想
$qian = 已知的值; //通常就是指最小级的数据值,是已知的;
for($i = 最小级的下一级, $i <= 目标级数; ++$i){
$result = 对 $qian 进行一个简单计算;
$qian = $result; //将当前求得的结果值,当做“要求的下一级的”前一个值;
}
最后$result 就是结果;