使用JavaScript递归计算fibonacci(斐波那契)数列和阶乘

使用JavaScript递归计算fibonacci(斐波那契)数列和阶乘

递归、即通过循环调用自身来求解循环的问题,本例程通过递归方式计算斐波那契数列,这也是使用递归计算的一个经典问题。

例程支持直接输入参数调用,如果调用时没有附加斐波那契数列的调用参数,则需要从命令行输入数字并进行计算。

//JavaScript读写命令行
const readline=require('readline');
const rl=readline.createInterface({
    input:process.stdin,
    output:process.stdout
})

//fibonacci序列函数,递归调用
function fibo(index){
    if(parseInt(index)<1){
        return -1;
    }
    else if (parseInt(index)===1|parseInt(index)===2){
        return 1;
    }else{
        return fibo(parseInt(index)-1)+fibo(parseInt(index)-2);
    }
}

//读取命令行参数,如果输入了数字,则直接读取并计算
//node ./fibo.js 3
if(process.argv.length>2){
    let index=parseInt(process.argv[2]);//argv[0] 是node.exe ,argv[1]是本文件的名称
    console.log(`the fabonacci sequence of ${index} is ${fibo(index)}`);
    process.exit(0);
}

//如果调用时没有输入数字,则在此处输入数字
console.log("please input an integer to calculate the fabonacci sequence");
rl.on('line',(index)=>{
    console.log(`the fabonacci sequence of ${index} is ${fibo(index)}`);
    rl.close();
})

类似地,使用递归的方式也可以很容易计算阶乘,即f(n)=n!(n*(n-1)*(n-2)….*1) 。将上面程序段稍作修改,如下:

//JavaScript读写命令行
const readline=require('readline');
const rl=readline.createInterface({
    input:process.stdin,
    output:process.stdout
})

//factor序列函数,递归调用
function factor(index){
    if(parseInt(index)<0){
        return -1;
    }
    else if (parseInt(index)===0|parseInt(index)===1){
        return 1;
    }else{
        return parseInt(index)*factor(parseInt(index)-1);
    }
}

//读取命令行参数,如果输入了数字,则直接读取并计算
//node ./factor.js 3
if(process.argv.length>2){
    let index=parseInt(process.argv[2]);//argv[0] 是node.exe ,argv[1]是本文件的名称
    console.log(`the fabonacci sequence of ${index} is ${factor(index)}`);
    process.exit(0);
}

//如果调用时没有输入数字,则在此处输入数字
console.log("please input an integer to calculate the fabonacci sequence");
rl.on('line',(index)=>{
    console.log(`the fabonacci sequence of ${index} is ${factor(index)}`);
    rl.close();
})

当然,目前主流的高级语言都支持递归算法,只是实现方式略有区别,一个使用图形化的编程语言LabVIEW实现递归的例子见在LabVIEW中使用递归算法计算阶乘.

作者
魏智勇(John)
加入讨论

此站点使用 Akismet 来减少垃圾评论。了解我们如何处理您的评论数据

魏智勇(John)

站长,80后,创业者,擅长工业自动化与信息化技术,熟悉各种PLC,组态软件,熟悉计算机技术,熟悉LabVIEW、C,C#,JavaScript程序设计技术。