递归函数:
递归函数即自调用函数,在函数体内部直接或间接地自己调用自己,即函数的嵌套调用是函数本身。
该函数必须有一种能够"停止调用"的机制,如使用if语句。该机制,被称为递归函数的"出口"。
实例1:
function f1($n){
echo $n." ";
$n++;
}
f1(5);
输出结果5
实例2:
function f1($n){
echo $n." ";
$n++;
if($n<10){
f1($n);
}
}
f1(5);
输出结果:5 6 7 8 9
实例3
<?php
function f1($n){
echo $n." ";
$n++;
if($n<10){
f1($n);
echo $n." ";
}
}
f1(5);
?>
输出结果:5 6 7 8 9 9 8 7 6
实例4
function test($n){
echo $n." ";
if($n>0)
test($n-1);
else
echo "<-->";
}
test(10)
输出结果:10 9 8 7 6 5 4 3 2 1 0 <-->
实例5
function test($n){
echo $n." ";
if($n>0)
test($n-1);
else
echo "<-->";
echo $n." ";
}
test(10)
输出结果:10 9 8 7 6 5 4 3 2 1 0 <-->0 1 2 3 4 5 6 7 8 9 10
讨论实际应用中的递归思想应用(阶乘的实现):
阶乘的数学定义:一个正整数的阶乘,是从1一直乘到它本身的乘积。
阶乘的一个基本算法是:
n的阶乘 = (n-1)的阶乘 * n;
其中,1的阶乘是1。
function jiecheng($n){
if($n == 1){ //1的阶乘是1(已知)
return 1;
}
//其他数的阶乘,是 (该数) * (该数减一的阶乘) 的乘积
return jiecheng($n-1) * $n;
}
$v1 = jiecheng(5);
echo "<br />v1 = $v1";
以下为该函数的模拟调用过程:
$v1 = jiecheng(5)
$v1 = jiecheng(4) * 5
$v1 = (jiecheng(3) * 4) * 5
$v1 = ((jiecheng(2) * 3) * 4) * 5
$v1 = (((jiecheng(1) * 2) * 3) * 4) * 5
特别注意:上一行jiecheng(1)表示要求1的阶乘,但1的阶乘是"已知"的,为1
$v1 = (((1 * 2) * 3) * 4) * 5
$v1 = ((2 * 3) * 4) * 5
$v1 = (6 * 4) * 5
$v1 = 24 * 5
$v1 = 120
递归函数在类中如何定义?
如: 改名键名的大小写在类中方法的编写
private function changeArrKey($array, $case = 0){
if(!is_array($array)) return $array;
$tempArray = array();
$do = ($case === 0)? "strtolower" : "strtoupper";
foreach ($array as $key=>$value){
$key = $do($key);
if(is_array($value)){
$value = self::changeArrKey($value); //self 代表当前类
}else{
$value = $do($value);
}
$tempArray[$key] = $value;
}
return $tempArray;
}