众所周知,斐波那契数列是面试中一道常见的基础编程题。下面小编通过几种不同解法来让面试官对你眼前一亮!
斐波那契数列
小集面试官:请实现一个斐波那契数列。
初级小控
function feibonaqi(n) {
if (n <= 2) return 1;
else return feibonaqi(n - 1) + feibonaqi(n - 2);
}
console.log(feibonaqi(10));
/*
存在问题:
1.函数拼音命名。
2.尾递归调用未优化。
*/
中级小控
function fibonacci (n, cur = 1, result = 1) {
if (n <= 2) return result;
return fibonacci(n - 1, result, cur + result)
}
console.log(fibonacci(10));
/*
优点:
1.尾递归调用优化。
*/
高级小控
function Fibonacci() {
const fibonacci = [0, 1, 1];
return function (n) {
if (fibonacci[n]) return fibonacci[n];
for (let i = fibonacci.length; i <= n; i++) {
fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
}
return fibonacci[n];
}
}
Fibonacci.getInstace = function () {
if (!this._instance) this._instance = Fibonacci();
return this._instance;
}
const fibonacci = Fibonacci.getInstace();
console.log(fibonacci(10));
/*
优点:
1.闭包实现缓存。
2.单例模式。
*/
数学课代表小控
function fibonacci(n) {
const SQRT_FIVE = Math.sqrt(5);
return Math.round(
(1 / SQRT_FIVE) * (Math.pow(0.5 + SQRT_FIVE / 2, n) - Math.pow(0.5 - SQRT_FIVE / 2, n)),
)};
TS大佬控总
众所周知,TS是图灵完备的。
// 斐波那契函数
type fibonacii<n extends number> = n extends 1
? 1
: n extends 2
? 1
: add<fibonacii<subtractOne<n>>, fibonacii<subtractOne<subtractOne<n>>>>;
// 获取数组长度,ts不支持数字直接相加,可以先转换成数组,合并,再计算长度
type getLength<arr extends any[]> = arr["length"];
// 转换成数组
type convertToArr<n extends number, arr extends any[] = []> = getLength<arr> extends n
? arr
: convertToArr<n, [any, ...arr]>;
// 两数相加
type add<firstNum extends number, secondNum extends number> = getLength<
[...convertToArr<firstNum>, ...convertToArr<secondNum>]
>;
// 数组长度减一
type subtractArrayOne<arr extends any[]> = ((...arg: arr) => any) extends (
firstNum: any,
...restArr: infer restArrType
) => any
? restArrType
: [];
// 数字减一
type subtractOne<n extends number> = getLength<subtractArrayOne<convertToArr<n>>>;
type fibonaciiOfTen = fibonacii<10>;
总结
以上代码都是没有做错误处理的,所以...
注意细节,细节将会使面试官对你眼前一亮。
参考
[2] 尾调用优化 - 阮一峰的网络日志