JS 函数的递归算法

一、什么是函数的递归
函数反复调用自己,直到最终结果,跳出

var n = 0;
shownumber();
function shownumber() {
    n += 1;
    if (n === 10000) {
        console.log(n);
        return;
    }
    shownumber();
}

二、举例
例1:递归阶乘函数

function factorial(num){
    if(num<=1){
        return 1;
    }
    else{
        return num*factorial(num-1);
    }
}

问题1:以上函数表面看起来没有问题,但下面代码会导致其出错,例:

var anotherFactorial=factorial;
factorial=null;
alert(anotherFactorial(3));  //出错 

以上代码先把factorial()函数保存在变量anotherFactorial中,然后将factorial变量设置为null,结果指向原始函数的引用只剩下一个。但在接下来调用anotherFactorial()时,由于必须执行factorial(),而factorial已经不再是一个函数,就会导致错误。因此,需用arguments.callee,即一个指向正在执行的函数的指针,可以用它来实现函数的递归调用,例:

function factorial(num){
    if(num<=1){
        return 1;
    }
    else{
        return num*arguments.callee(num-1);
    }
}

问题2:在严格模式下,不能通过脚本访问arguments.callee,访问这个属性会导致错误。因此,可使用命名函数表达式来达成相同结果,例:

var factorial=(function f(num){
    if(num<=1){
        return 1;
    }
    else{
        return num*f(num-1);
    }
});
var anotherFactorial=factorial;
factorial=null;
alert(anotherFactorial(4));

以上代码创建了一个名为f()的命名函数表达式,然后将它赋值给变量factorial。即便把函数赋值给了另一个变量,函数的名字f仍然有效。

例2:5的n!

function jiecheng(n) {
    if (n == 0) {
        return 1;
    }
    return jiecheng(n - 1) * n;
}
console.log(jiecheng(5));

//f(3)=f(2)*3;    f(3)=1*1*2*3
//f(2)=f(1)*2;
//f(1)=f(0)*1

例3:Fibonacci数列 1,1,2,3,5,8,13,21
当前位的值

var fib = function (n) {
    if (n <= 2) {
        return 1;
    }
    return fib(n - 2) + fib(n - 1);
}
console.log(fib(3));

//fib(3)    fib(1)+fib(0)+fib(1)
//fib(2)   fib(1)+fib(0)

例4:1-100之和

function f1(x) {
    if (x <= 0) {
        return 0;
    }
    return x + f1(x - 1);
}
console.log(f1(100));
    原文作者:递归算法
    原文地址: https://blog.csdn.net/weixin_43675447/article/details/86767858
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞