前端通过斐波那契数列让面试官眼前一亮

372 阅读1分钟

3132079fc1622a3ec78c4ce795745dc5.jpeg

众所周知,斐波那契数列是面试中一道常见的基础编程题。下面小编通过几种不同解法来让面试官对你眼前一亮!

斐波那契数列

小集面试官:请实现一个斐波那契数列。

初级小控

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.单例模式。
*/

数学课代表小控

image.png

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>;

image.png

总结

以上代码都是没有做错误处理的,所以...

注意细节,细节将会使面试官对你眼前一亮。

参考

[1] TypeScript 实现斐波那契数列

[2] 尾调用优化 - 阮一峰的网络日志

[3] 用 TypeScript 类型运算实现一个中国象棋程序