迭代、递归解决斐波纳挈数列问题

11 篇文章 0 订阅
<?php


/**
 * @param $n int 第N项
 *
 * @return int 第N项的值
 */
function f($n) {
	//已知条件
	$before_1 = 1;//前一项(初始化时就是第二项)
	$before_2 = 1;//前二项(初始化时就是第一项)

	//判断是否是第一项或第二项
	if($n == 1) {
		return $before_2;
	} elseif ($n == 2) {
		return $before_1;
	}
	

	//计算第$n项,从第三项开始,到第$n项,逐一计算
	for($i=3; $i<=$n; ++$i) {
		$now = $before_1 + $before_2;//得到当前项$now
		//切换前一项,和前二项,整体向后移动
		$before_2 = $before_1;
		$before_1 = $now;
	}

	return $now;
}

echo f($_GET['n']);
//echo f(2);
//echo '<br>';
//echo f(5);
//echo '<br>';
//echo f(10);
<?php

//递归的方案解决斐波纳挈数列

/**
 * @param $n int 第N项
 *
 * @return int 第N项的值
 */
function f($n) {
	//递归出口,前两项已知
	if($n == 1) {
		return 1;
	} elseif ($n == 2) {
		return 1;
	}

	//利用公式完成
	//递归点,每项前两项之和
	return f($n-1) + f($n-2);
}

echo f($_GET['n']);

//echo f(5);//5
//f(5) = return f(4) + f(3);
//	 = return (return f(3) + f(2)) + f(3);
//	 = return (return (return f(2) + f(1)) + f(2)) + f(3);
//	 = return (return (return 1 + f(1)) + f(2)) + f(3);
//	 = return (return (return 1 + 1) + f(2)) + f(3);
//	 = return (return 2 + 1) + f(3);
//	 = return 3 + (return f(2) + f(1));
//	 = return 3 + (return 1 + f(1));
//	 = return 3 + (return 1 + 1);
//	 = return 3 + 2;
//	 = return 5;

//
//echo '<br>';
//echo f(10);//55



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值