斐波那契数列 :
1 1 2 3 5 8 13 21 。。。
规律:从第三个数开始,值为前两个数值的和:An=A(n-1)+A(n-2)
迭代方法:
/*
$n1:数列的第一个值;
$n2:数列的第二个值;
$n:要求得的第N个值;
*/
function Fibonacci($n1,$n2,$n){
for($i=0;$i<$n;$i++){
$tmp = $n1+$n2;
$n1 = $n2;
$n2 = $tmp;
}
return $tmp;//得到的是第n+2个位置的值。
}
echo Fibonacci(1,1,5);
递归方法:
function Fibonacci($n1,$n2,$n){
if($n<=2){
return $n2;
}else{
return Fibonacci($n2,$n1+$n2,$n-1);
}
}
//echo Fibonacci(1,1,5);
递归2:
function Fibonacci($n){
if($n<=2){
return 1;
}else{
return Fibonacci($n-1)+Fibonacci($n-2);
}
}
//echo Fibonacci(1,1,5);
JS实现斐波那契数列:
function Fibonacci(n){
var a=0,b=1,arr=[0,1];
while(arr.length<n){
[a,b]=[b,a+b];
arr.push(b);
}
return arr;
}
Fibonacci(10);
递归流程:
1:找到递归的终止条件,
2:在终止条件下的输出(即简单场景的处理方法)
3:改变参数调用递归(提取反复逻辑,缩小规模)
递归改为迭代:
1:建立自己的堆栈代替系统栈,用来保存内容,
2:将递归调用改为循环调用。
以阶乘为例:n! = n(n-1)(n-2)。。。2*1
阶乘递归:
function Factorial($n){
if($n==1){
return 1;
}else{
return $n*Factorial($n-1);
}
}
echo Factorial(3);
改为迭代:
function Factorial($n){
$tmp = 1;
for($i=1;$i<=$n;$i++){
$tmp*=$i;
}
return $tmp;
}
echo Factorial(5);