13. 函数:递归

递归是指一个函数重复调用本身的一种编程技巧。有一些数据结构或过程可以递归地表达为基本情况,在这个时候函数内部使用递归可以简化编写逻辑。

  • 使用递归写 factorial(阶乘)函数

输入:0
输出:1

输入:1
输出:1*factorial(1-1) = 1*factorial(0) = 1 * 1 = 1

输入:3
输出:3*factorial(3-1) = 6

  1. const { log } = console;
  2. function factorial(n) {
  3. if(n === 0) return 1;
  4. let res = 1;
  5. for(let i = 2 ; i <= n ; i ++) {
  6. res = res * i;
  7. }
  8. return res;
  9. }
  10. log(factorial(10));
  11. // -> 3628800
  • 使用递归写 fibonacci(斐波那契) 函数
  1. const { log } = console;
  2. function fabonacci(n) {
  3. if(n == 0) return 0;
  4. if(n == 1) return 1;
  5. return fabonacci(n-1)+fabonacci(n-2)
  6. }
  7. log(fabonacci(20));
  8. // -> 6765
  • 使用递归写 sum 函数

输入:0
输出:0

输入:1
结果:1+0

输入:3
结果:3+2+1+0

  1. const { log } = console;
  2. function sum(n) {
  3. if(n === 0) return 0;
  4. if(n === 1) return 1;
  5. return sum(n-1) + n;
  6. }
  7. log(sum(100));
  8. // -> 5050
  • 使用递归反转数组
  1. const { log } = console;
  2. function reverse(arr) {
  3. let res = [];
  4. if(arr.length === 1) return arr;
  5. return res.concat(arr.pop(),reverse(arr))
  6. }
  7. log(reverse([1, 2, 3, 4, 5]));
  8. // -> [ 5, 4, 3, 2, 1 ]
  • 使用递归验证回文字符串
  1. const { log } = console;
  2. const str = 'ya';
  3. function isPalindrome(str) {
  4. let len = str.length
  5. if(str[0] === str[len -1]) {
  6. if(len <= 3) return true;
  7. else {
  8. return isPalindrome(str.substring(1,len));
  9. }
  10. }
  11. else return false;
  12. }
  13. log(isPalindrome(str));
  14. // -> true