什么是函数递归思想?
递归思想:把一个相对复杂的问题,转化为一个与原问题相似的,且规模较小的问题来求解。
递归方法只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
但在带来便捷的同时,也会有一些缺点,函数递归的运行效率不高(多次调用时)。
递归调用是一种特殊的嵌套调用,是某个函数调用自己或者是调用其他函数后再次调用自己的,只要函数之间互相调用能产生循环的则一定是递归调用,递归调用一种解决方案,一种是逻辑思想,将一个大工作分为逐渐减小的小工作,递归是一种思想,只不过在程序中,就是依靠函数嵌套这个特性来实现了。
递归调用的定义:
递归调用就是在当前的函数中调用当前的函数并传给相应的参数,这是一个动作,这一动作是层层进行的,直到满足一般情况的的时候,才停止递归调用,开始从最后一个递归调用返回。
了解斐波那契数列:
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(3)=2,F(n)=F(n-1)+F(n-2)(n>=4,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。
问题:
有如下一个数列:1,1, 2, 3, 5, 8, 13, 21,....... 其规则是:前两个已知(即1和2),从第3个开始,其值为其左边两个值的和(此数列称为斐波那契数列)。定义一个函数,该函数可以求出该数列的任意第n个数的值。
代码实现:
//利用递归解决斐波那契数列问题
function math($number) {
if ($number == 1 || $number == 2) {
return 1;//递归出口
}
return math($number - 1) + math($number - 2);//递归调用函数
}
echo math(20) . "
";
?>
运行结果:
其他递归调用问题:
1,已知,老五比老四小5岁,老四比老三小5岁,老三比老二小5岁,老二比老大小5岁,且老大为40岁。求老五的年龄为?
代码实现:
//实例:用递归调用求老五的年龄
function recursive($num) {
//递归退出条件
if ($num == 1) {
return 40;
} else {
//递归调用
return recursive($num - 1) - 5;
}
}
echo "老五的年龄为:";
echo recursive(5);
echo "
";
?>
运行结果:
2,猴子吃桃问题:
有一群猴子,去摘了一堆桃子,商量之后决定每天吃剩余桃子的一半,当每天大家吃完桃子之后,有个贪心的小猴都会偷偷再吃一个桃子,按照这样的方式猴子们每天都快乐的吃着桃子;直到第十天,当大家再想吃桃子时,发现只剩下一个桃子了。问:猴子们一共摘了多少桃子?【经典面试题】
问题分析:
按照题意,猴子们每天吃桃子的一半,小猴子再偷吃一个,等于每天都吃前一天剩余桃子的一半加一个,知道第十天只剩一个桃子。
代码实现:
//实例:猴子吃桃
function numbers($numbers) {
//递归退出条件
if ($numbers == 10) {
return 1;
} else {
//递归调用
return (numbers($numbers + 1) + 1) * 2;
}
}
echo "总共摘的桃子为:";
echo numbers(1);
echo "
";
?>
运行结果: