我希望我可以在这里发布这个问题,即使我也在其他网站上发布了它。如果我未能遵守适当的协议,我深表歉意,请立即通知我,以便我删除帖子并吸取教训。
我已经做了一年多的前端开发人员了。我上学是为了学习 Web 开发,我认为自己在处理简单的 JavaScript 方面是一个有能力的程序员。但是当涉及到编写任何类型的斐波那契函数时,我无法做到。就好像我的大脑中缺少了一块可以理解如何处理这个简单数字序列的东西。这是一段工作代码,我很确定我是从 John Resig 的书或网上某处获得的:
fibonacci = (function () {
var cache = {};
return function (n) {
var cached = cache[n];
if (cached) return cached;
if (n <= 1) return n;
console.log(n);
return (cache[n] = fibonacci(n - 2) + fibonacci(n - 1));
};
}());
当我用 10 作为参数调用这个函数时,我得到这个序列:10,8,6,4,2,3,5,7,9
以下是我的理解:
fibonnaci 被分配了一个立即调用的函数表达式(或自执行等等等等),使用传递的任何参数启动缓存。如果争论已经在缓存中,我们只需将其归还并过着永恒的和平生活。如果参数为 1 或更少,这也是函数的结束,永恒的和平再次发生。但是,如果这两个条件都不存在,那么该函数会返回这个语句,让我觉得我只是一只穿着人类西装的猴子。
我想做的是按正确的顺序生成前 10 个斐波那契数,因为如果我能做到,那么我会觉得我至少理解了它。
因此,当前两个条件失败时,代码会创建一个新的缓存变量并将其设置为等于 fibonacci 函数的结果,无论传递的任何参数为负 2,然后它将结果加上负 1 .... 现在我的问题
- 问题 1:如果从未计算过 fibonacci(n),函数如何知道 fibonacci(n-2) 是什么?
- 问题 2:递归函数是线性的,或者它们遵循什么顺序?
- 问题3:如果我不能理解这一点,我还有成为程序员的希望吗?
感谢您的时间。
在通过这个块之后,我稍微改变了函数,看看我是否可以在变量中保存结果并输出它,看看会发生什么,我得到了一些非常意想不到的结果。
这是变化:
fibonacci = (function () {
var cache = {};
return function (n) {
var cached = cache[n];
if (cached) {
console.log(cached);
return cached;
}
if (n <= 1) {
console.log(n);
return n;
}
console.log(n);
var result = (cache[n] = fibonacci(n - 2) + fibonacci(n - 1));
console.log(result);
return result;
};
}());
这是生成的模式:10,8,6,4,2,0,1,1,3,1,1,2,3,5,2,3,5,8,7,5,8,13,21 ,9,13,21,34,55 对为什么会发生这种情况有任何帮助吗?