递归程序设计的简单理解
递归算法:在函数或子过程的内部,直接或者间接地调用自己的算法。
- 初始化算法。递归程序通常需要一个开始时使用的种子值(seed value)。要完成此任务,可以向函数传递参数,或者提供一个入口函数, 这个函数是非递归的,但可以为递归计算设置种子值。(求解关系表达式)
- 检查要处理的当前值是否已经与基线条件相匹配。如果匹配,则进行处理并返回值。(结束递归的条件)
- 使用更小的或更简单的子问题(或多个子问题)来重新定义答案。
- 对子问题运行算法。
- 将结果合并入答案的表达式。
- 返回结果。
自己写的几个递归的小实例,练习一下(php)
最经典的兔子问题: 斐波纳契数列
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
关系式为 a(n) = a(n-1)+a(n-2)
递归法求解为
function tuzi($n){
if($n<=1){
return 1;
}
return (tuzi($n-1)+tuzi($n-2));
}
if($n<=1){
return 1;
}
return (tuzi($n-1)+tuzi($n-2));
}
求整数的和 (1~100)
function add_num($n){
if($n<=0){
return 0;
}
return $n + add_num($n-1);
}
if($n<=0){
return 0;
}
return $n + add_num($n-1);
}
求数组中最大值问题(这个跟循环求解基本一样)
function array_max($arr,$n,$max){
if($n<=0){
return $max;
}
if($arr[$n]>$max){
$max = $arr[$n];
}
return array_max($arr,$n-1,$max);
}
if($n<=0){
return $max;
}
if($arr[$n]>$max){
$max = $arr[$n];
}
return array_max($arr,$n-1,$max);
}