递归
2019-03-13 18:24
92 查看
递归函数是函数反复调用自己,直到执行到最终结果,然后跳出。
举个栗子:
//5的n! function f(num){ if(num<=0){ return 1; }else{ return num*f(num-1); } } f(5);
上面的函数表面看起来没有问题,但是下面的代码可能会导致它出错
var another=f(); f=null; alert(another(4));
以上代码先把f()函数保存在变量another中,然后将f变量设置为null;但接下来调用another()时,必须执行f(),而此时f已不再是函数,所以就会导致错误,在这种情况下,使用arguments.callee可以解决这个问题。
arguments.callee是一个指向正在执行函数的指针,因此可以用它来实现递归函数的调用,如下:
function f(num){ if(num<=0){ return 1; }else{ return num*arguments.callee(num-1); } } f(5);
通过使用arguments.callee代替了函数名,这样无论怎样调用函数都不会出现问题。但是在严格模式下,不能通过脚本访问arguments.callee,访问这个属性会导致出错,在这种情况下,可以使用命名函数表达式来实现相同的结果。例如:
var factorial=(function f(num){ if(num<=0){ return 1; }else{ return num*f(num-1); } }); factorial(5);
以上代码创建了一个名为f()的命名表达式,然后将它赋值给变量factorial,即使把函数赋给了另一个变量,函数f()仍然有效,所以递归调用能正常完成。这种方式在严格模式和非严格模式下都能完成。
相关文章推荐
- 递归
- 数据结构之递归
- leetCode解题报告之构造二叉树(递归)
- 递归问题解决二叉树问题
- 递归和阶乘
- 递归下降分析
- (C++)剑指offer-8:跳台阶(递归和循环)
- Asp.net—递归方式的FindControl
- DOS命令 递归删除子目录下的各同名文件夹
- 递归(任何有赋值,if-else和循环的结构都可以转化为递归)
- UVA10410 TreeReconstruction 树重建 (dfs,bfs序的一些性质,以及用栈处理递归 )
- 利用递归来模拟多重嵌套循环.
- java-两个递归问题
- 算法训练 求先序排列 【二叉树的递归遍历】
- 正则表达式--递归匹配、非贪婪匹配与分组替换
- 二叉树前序、中序、后序遍历的递归与非递归算法实现
- (无限级、非递归)树形分类
- 剑指offer面试题9——矩形框覆盖(递归改循环,斐波那契数列)
- 算法学习(一):递归与分治策略(2)
- 用深度优先算法递归解决迷宫问题