递归、即通过循环调用自身来求解循环的问题,本例程通过递归方式计算斐波那契数列,这也是使用递归计算的一个经典问题。
例程支持直接输入参数调用,如果调用时没有附加斐波那契数列的调用参数,则需要从命令行输入数字并进行计算。
//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中使用递归算法计算阶乘.