简介
就是函数调用自身,直到终止。
举例
一、求和
求1到100的和
1、for循环
初始条件:i=1
结束条件:i=100
循环条件:i++
循环体:sum = sum + i
var sum = 0;
for (let i = 1; i <= 100; i++) {
sum = sum + i;
}
console.log(sum); // 5050
2、递归
初始条件:n=100
结束条件:n=1
循环条件:n--
循环体:sum(n) = sum(n-1) + n
function sum (n) {
if (n == 1) {
return 1;
}else {
return sum(n-1) + n;
}
}
var result = sum(100);
console.log(result); // 5050
二、求阶乘
阶乘:一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。
求5的阶乘
1、for循环
初始条件:i=1
结束条件:i=5
循环条件:i++
循环体:product = product * i
var product = 1;
for (let i = 1; i <= 5; i++) {
product = product * i;
}
console.log(product); // 120
2、递归
初始条件:n=5
结束条件:n=1
循环条件:n--
循环体:factorial(n) = factorial(n-1) * n
function factorial (n) {
if (n == 1) {
return 1;
}else {
return factorial(n-1) * n;
}
}
var result = factorial(5);
console.log(result); // 120
其他问题
var otherName = factorial;
factorial = null;
otherName(3);
这个函数的执行与函数名 factorial 紧紧耦合在了一起,如果换一个名字,就会出错。上述代码会报这样的错误:factorial is not a function
解决方式
1、arguments.callee
arguments.callee
属性包含当前正在执行的函数。
function factorial (n) {
if (n == 1) {
return 1;
}else {
return arguments.callee(n-1) * n;
}
}
var otherName = factorial;
factorial = null;
var result = otherName(5);
console.log(result); // 120
在严格模式下,第5版 ECMAScript (ES5) 禁止使用 arguments.callee()。当一个函数必须调用自身的时候, 避免使用 arguments.callee(), 通过要么给函数表达式一个名字,要么使用一个函数声明.
2、命名函数
var renameFactorial = (function factorial (n) {
if (n == 1) {
return 1;
}else {
return factorial(n-1) * n;
}
});
var otherName = renameFactorial;
renameFactorial = null;
var result = otherName(5);
console.log(result); // 120