3.1 案例介绍
斐波那契函数
3.2 分析案例
有数列如下:
1 1 2 3 5 8 13 21 34 55 89………
要求使用递归编程实现该数列的排列,输出前100项。
3.3 核心知识
自定义函数
函数参数传递
递归
3.4知识讲解
3.4.1 变量的能见度
所谓变量的能见度,意指变量在程序中的可作用范围。当一个变量执行赋值动作后,会随着声明局部的差异,而有不同的作用范围。大致上来说变量会依据声明的局部分为下列两种:局部变量和全局变量。
局部变量:
在函数之中声明的变量就是局部变量,并且该变量只有在函数范围之中才能加以使用。如果其它程序局部需要调用使用该变量值时,必须透过「return」指令,来将其传回至主程序区块以作后续处理。
<?php
$A=0;
function print_A(){
$A = 3; //定义局部变量
echo "在函数中显示局部变量A 值: $A <p>";
return $A;
}
$B = print_A();
echo "在函数外显示局部变量A 值: $B <br>";
echo $A;
?>
全局变量:
在函数范围之外所声明的变量就是全局变量。由于函数可以视为单独的程序片段,所以局部变量会复盖全局变量的能见度,因此在函数中并无法直接调用使用全局变量。
函数中若要使用全局变量时,必须要利用global关键字定义目标变量,以告诉函数主体此变量为全局。
<?php
$A=“Hello !!”; //定义全局变量
function print_A() //定义函数 print_A()
{
global $A; //global关键字声明变量 A 为全局变量
echo $A;
}
print_A();
?>
也可以使用预定义的全局变量数组$GLOBALS.这是一个特殊变量在程序运行时自动创建。例如:echo $GLOBALS[“A”];
静态变量:
PHP支持声明函数变量为静态的(static)。
一个静态变量在所有对该函数的调用之间共享,并且仅在脚本的执行期间函数第一次被调用时被初始化。要声明函数变量为静态的用关键字static。
<?php function test( ) { static $a = 0; echo $a; $a++; }
test( );
test( );
test( );
?>
3.4.2 自定义函数
函数的定义:
函数(function)是一段完成指定任务的已命名代码,函数可以遵照给它的一组值或参数完成任务,并且可能返回一个值。使用函数可以节省编译时间,因为无论调用多少次,函数只需被编译一次。
函数的优越性:
—— 控制程序设计的复杂性
—— 提高软件的可靠性
—— 提高软件的开发效率
—— 提高软件的可维护性
—— 提高程序的重用性
自定义函数语法格式:
function 函数名称(参数1,参数2 …)
{
程序内容叙述;
return 返回值; //如需函数有返回值时使用;
}
函数的使用:函数名称(参数1,参数2 …);
实例:
<?php
echo “用函数求累加:
";
function test($a)
{
$sum=0;
for($i=0;$i<=$a;$i++)
{
$sum+=$i;
}
return $sum;
}
echo "50的累加是:".test(50)."<br>";
echo "100的累加是:".test(100)."<br>";
?>
自定义函数的名称:
它是函数在程序代码中的识别名称,函数名可以是以字母或下划线开头后跟零个或多个字母、下划线和数字的任何字符串。函数名不区分大小写。命名函数时不可使用已声明的函数,或PHP内建的函数名称。
参数:
所谓的参数就是用来把数值由函数外部传入函数体中,并用来加以运算处理。参数之间用“ ,”号隔开。当函数不需要任何数值传入时,可以省略参数。
返回值:
当调用函数时需要它返回一些数值,那么就要函数体中用return语句实现。格式如下:
return返回值; //返回值也可以是一个表达式
exit(); //用于直接退出函数。无返回值 void
3.4.3 参数的传递
在了解变量的能见度之后,接着来看看函数中的参数如何传递。所谓的参数传递,其实就是在执行函数前导入某些数值,以提供函数处理执行。
PHP 中传递参数的方式有:按值传递和按址传递
按值传递参数
父程序直接传递指定的值或是变量给函数使用。由于所传递的值或变量,与函数里的数值分别储存于不同的内存区块,所以当函数对所导入的数值作了任何变动时,并不会对父程序造成直接影响。
<?php
//声明变量A、B
$A = "Today";
$B = "Monday";
//声明函数print_A()并将变量AB 导入
function printA($AA, $BB)
{
$BB = $AA." is ".$BB;
echo "函数中变量A 与变量B 的值为<br>";
echo "变量A: ".$AA."<br>";
echo "变量B: ".$BB."<p>";
}
//执行函数print_A()并将变量A,B 导入
printA($A, $B);
echo "主程序中变量A 与变量B 的值为<br>";
echo "变量A: ".$A."<br>";
echo "变量B: ".$B."<p>";
?>
按址传递参数(用“&”符号实现)
相对于按值传递模式,并不会将父程序中的指定数值或目标变量传递给函数,而是把该数值或变量的内存储存区块相对地址导入函数之中。因此当该数值在函数中有任何变动时,会连带对父程序造成影响。
<?php
$A = "Today";
$B = "Monday";
//以传址方式导入变量B
print_A($A,&$B);
echo "主程序中变量A 与变量B 的值为<br>";
echo "变量A: ".$A."<br>";
echo "变量B: ".$B."<p>";
function print_A($A,$B)
{
$A="aaaaa";
$B = $A." is ".$B;
echo "函数中变量A 与变量B 的值为<br>";
echo "变量A: ".$A."<br>";
echo "变量B: ".$B."<p>";
}
?>
3.4.4 递归调用
所谓的函数递归调用,就是函数可以在其声明的执行叙述之中调用执行自己。
通常在此类型的函数之中会附加一个条件判断叙述,以判断是否需要执行递归调用,并且在特定条件下终止函数的递归调用动作,把目前流程的主控权交回上一层函数执行。因此当某个执行递归调用的函数,没有附加条件判断叙述时可能会造成无限循环的错误情形。函数递归调用最大的好处在于可以精简程序中繁杂重复调用程序,并且能以这种特性来执行一些较为复杂的运算动作。
实例:用递归求n阶乘
<?php
echo "利用递归调用来运算N 的阶乘<p>";
function facto($n)
{
if ($n > 1)
{
$r=$n*facto($n-1);
}
else
{
$r=$n;
}
return $r;
}
echo "当N 值为5 时,阶乘为: ".facto(5)."<br>";
echo "当N 值为10 时,阶乘为: ".facto(10);
?>
3.4.5代码重用
通过重复使用已有的代码,提高开发效率,降低成本
include( )和require( )函数:
require( )将一个文件在预处理期间被导入,像把该文件粘贴到使用函数的地方。
include( )与require ( )几乎等价,区别在于在脚本执行时包含,当处理失败时, include( )产生一个警告而require( )则导致一个致命错误。
include_once( )和require_once( )函数:
两个函数在脚本执行期间包括并运行指定文件。与include( )语句及require( )类似,唯一区别是如果该文件中的代码已经被包括了,则不会再次包括,只会包括一次。这两个函数应该用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。
3.5 知识运用
函数是我们以后编程中一直在用的知识,将每个业务逻辑分成小块儿进行封装。
递归:在我们没有学习循环的时候,递归可以帮助我们完成循环的功能。
递归同样适用于我们不清楚循环次数情况下的检索。例如栏目的无限分类。
此章所涉及的内容,在日常编程中处处存在,应用范围相当广泛。
网友评论