我已经创建了一个递归形式的fibonacci的记忆函数,我用它作为其他类型的函数使用记忆的例子,我的实现是糟糕的,因为如果我把它包含在一个库中,这意味着global
变量仍然可见。
这是原始的递归斐波那契函数:
function fibonacci($n) {
if($n > 1) {
return fibonacci($n-1) + fibonacci($n-2);
}
return $n;
}
我把它修改成了一个记忆版本
$memo = array();
function fibonacciMemo($n) {
global $memo;
if(array_key_exists($n, $memo)) {
return $memo[$n];
}
else {
if($n > 1) {
$result = fibonacciMemo($n-1) + fibonacciMemo($n-2);
$memo[$n] = $result;
return $result;
}
return $n;
}
}
我故意没有使用迭代法来实现斐波那契。有没有更好的方法来记忆斐波那契函数?你能给我建议更好的改进吗?我已经看到了func_get_args()
和call_user_func_array
作为另一种方法,但我似乎不知道什么是更好的?
所以我的主要问题是:* * 如何在php中正确记忆斐波那契函数?或在php中记忆斐波那契函数的最佳方法是什么?**
5条答案
按热度按时间neekobn81#
EddMann展示了一个在His post中用php实现
memoize
函数的好方法下面是示例代码(实际上摘自Edd Mann的帖子):
注意,由于函数clousure和PHP的一流函数支持,
global
定义被替换了。其他解决方案:
您可以创建一个
class
,其中包含以下静态成员:fibonnacciMemo
和$memo
。请注意,您不再需要将$memo
用作全局变量,因此它不会与其他名称空间给予任何冲突。使用这个,你可以避免使用
global
,也可以避免 * 清理该高速缓存 * 的问题。尽管$memo
不是 * 线程保存 *,存储的键也不是 * 散列值 *。无论如何,你可以使用所有的php memoize实用程序,比如memoize-phpjs5cn81o2#
我想......这应该是为了记住斐波那契:
一些测试
mzaanser3#
另一种解决方案:
性能:
7hiiyaii4#
这是一个记忆斐波那契数列的实现:
呼叫
ni65a41a5#