扭曲的斐波那契 - JavaScript
Fibonacci with a Twist - JavaScript
JavaScript 面试时有人问我这个问题。
实现斐波那契数列以列出 n 个数字(n 不包括在内)的序列,其中递归仅对偶数发生。
例如
fib(10) -> fib(8) + fib (6)
fib(8) -> fib(6) + fib(4)
fib(6) -> fib(4) +fib(2)
fib(4) -> fib(2)
我不知道该怎么做。
这绝对需要更多的说明。 (面试官应该更清楚)
但据我了解...
所以这个系列必须从某个地方开始,我假设它从 fib(2) = 1 开始。然后是面试官给出的 "code" 部分。
这可以很简单:
- fib(2) = 1
- fib(4) = 1
- fib(6) = 2
- ...
即fib(n) = fib_orig(n/2)
考虑
fib( 4) = fib( 2) = 1 * fib(2)
fib( 6) = fib( 4) + fib( 2) = 2 * fib(2)
fib( 8) = fib( 6) + fib( 4) = 3 * fib(2)
fib(10) = fib( 8) + fib( 6) = 5 * fib(2)
fib(12) = fib(10) + fib( 8) = 8 * fib(2)
fib(14) = fib(12) + fib(10) = 13 * fib(2)
^
this is fibonacci
在代码中我们得到这个 - 一个很好的小递归(对所有偶数 n >= 0 有效):
var i;
function fib(n) {
switch (true) {
case n === 0:
return 0;
case n === 2:
return 1;
default:
return fib(n - 2) + fib(n - 4);
}
}
function writeFib(n) {
document.write('fib(' + n + ') = ' + fib(n) + ' * fib(2)<br>');
}
for (i = 0; i <= 20; i += 2) {
writeFib(i);
}
如果您想要 fib(10) -> fib(8) + fib(6)
这样的结果,那么这样做(无递归):
var i;
function fib(n) {
switch (true) {
case n === 0:
return '0';
case n === 2:
return 'fib(2)';
default:
return 'fib(' + (n - 2) + ') + fib(' + (n - 4) + ')';
}
}
function writeFib(n) {
document.write('fib(' + n + ') -> ' + fib(n) + '<br>');
}
for (i = 0; i <= 20; i += 2) {
writeFib(i);
}
JavaScript 面试时有人问我这个问题。
实现斐波那契数列以列出 n 个数字(n 不包括在内)的序列,其中递归仅对偶数发生。 例如
fib(10) -> fib(8) + fib (6)
fib(8) -> fib(6) + fib(4)
fib(6) -> fib(4) +fib(2)
fib(4) -> fib(2)
我不知道该怎么做。
这绝对需要更多的说明。 (面试官应该更清楚)
但据我了解...
所以这个系列必须从某个地方开始,我假设它从 fib(2) = 1 开始。然后是面试官给出的 "code" 部分。
这可以很简单:
- fib(2) = 1
- fib(4) = 1
- fib(6) = 2
- ...
即fib(n) = fib_orig(n/2)
考虑
fib( 4) = fib( 2) = 1 * fib(2)
fib( 6) = fib( 4) + fib( 2) = 2 * fib(2)
fib( 8) = fib( 6) + fib( 4) = 3 * fib(2)
fib(10) = fib( 8) + fib( 6) = 5 * fib(2)
fib(12) = fib(10) + fib( 8) = 8 * fib(2)
fib(14) = fib(12) + fib(10) = 13 * fib(2)
^
this is fibonacci
在代码中我们得到这个 - 一个很好的小递归(对所有偶数 n >= 0 有效):
var i;
function fib(n) {
switch (true) {
case n === 0:
return 0;
case n === 2:
return 1;
default:
return fib(n - 2) + fib(n - 4);
}
}
function writeFib(n) {
document.write('fib(' + n + ') = ' + fib(n) + ' * fib(2)<br>');
}
for (i = 0; i <= 20; i += 2) {
writeFib(i);
}
如果您想要 fib(10) -> fib(8) + fib(6)
这样的结果,那么这样做(无递归):
var i;
function fib(n) {
switch (true) {
case n === 0:
return '0';
case n === 2:
return 'fib(2)';
default:
return 'fib(' + (n - 2) + ') + fib(' + (n - 4) + ')';
}
}
function writeFib(n) {
document.write('fib(' + n + ') -> ' + fib(n) + '<br>');
}
for (i = 0; i <= 20; i += 2) {
writeFib(i);
}