Javascript 递归函数
递归函数就是在函数内部调用它自己。在Javascript 中有很多写法,值得我们学习一下(Javascript太灵活了)。还是用n的 阶乘 来写例子吧.
1. 首先,来看一个最普通 最正常的写法。
function fac(num) {
if (num < 2) {
return 1;
} else {
return num * fac(num - 1);
}
}
var temp = fac;
fac = null;
alert(temp(5));
但是这种写法有一个问题就是,存在一些特殊场景,我们可能需要把fac函数赋值给其它对象,这时在调用这个对象的时候可能会出现问题。就像上面代码所示的调用。
2. 这时我们使用Javascript中arguments.callee 来解决这种耦合的问题。但是 在严格模式下,不能使用这种方式。
function fac(num) {
//"use strict";
if (num < 2) {
return 1;
} else {
return num * arguments.callee(num - 1);
}
}
alert(fac(5));
注意:严格模式:在作用域中添加 "use strict" 就进入严格模式。但是 "use strict" 不论前面 后面 还是中间 都不能添加空格,不然无效。
3. 可以使用函数表达式来实现同样的功能。
var fac = (function f(num) {
if (num < 2) {
return 1;
} else {
return num * f(num - 1);
}
});
var temp = fac;
fac = null;
alert(temp(5));
Javascript 递归函数的更多相关文章
- javascript递归函数
递归函数:是指函数直接或间接调用函数本身,则称该函数为递归函数. 这句话理解起来并不难,从概念上出发,给出以下的例子: function foo(){ console.log("函数 foo ...
- JavaScript递归函数解“汉诺塔”
“汉诺塔”是一个著名的益智游戏.塔上有3根柱子和一套直径各不相同的空心圆盘.开始时柱子上的所有圆盘都按照从小到大的顺序堆叠.目标是通过每次移动一个圆盘到另一根柱子,最终把一堆圆盘移动到目标柱子上,过程 ...
- javascript 递归之阶乘
阶乘,即5! = 5*4*3*2*1, 先看传统的做法,利用while循环实现: function factorial(num){ var result = num; if(num<0){ re ...
- 如何使用javascript书写递归函数
递归函数大家都应该比较熟吧?那么,如何在javascript中书写一个完美的递归函数呢?且听我娓娓道来. 递归函数 写的时候,查了一下维基百科对递归函数的定义,恕我愚钝,简直太深奥了!所以,我还是简单 ...
- JavaScript中的递归函数问题
学过其它编程语言的都应该会知道递归这个问题,递归函数是在一个函数通过名字调用自身的情况下后构成的. function fac(num){ if(num<=1){ return 1; }else{ ...
- [译]Javascript中的递归函数
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- javascript中的递归函数
正常的递归函数如下: function factorial(num){ ){ ; }else{ ); } } 这个函数表面看起来还ok,但如果我们执行下面代码就会出错. var jenny = fac ...
- JavaScript中递归函数用法需要注意的
<script> function sum(num){ if(num<=1){ return 1; }else{ return num*sum(num-1);//return num ...
- JavaScript正则表达式检验与递归函数实际应用
JS递归函数(菲波那切数列) 实例解析: 一组数字:0 1 1 2 3 5 8 13 0 1 2 3 4 5 6 7 sl(0)=0; sl ...
随机推荐
- Glib程序使用Valgrind查找内存泄露
G_DEBUG=gc-friendly G_SLICE=always-malloc //glib有缓存 故需使用 上述两条设置环境变量 G_SLICE和G_DEBUG排除由内存分配机制带来的 ...
- Oracle EBS-SQL (SYS-5):sys_配置文件查询.sql
select distinct l.profile_option_name, v.profile_option_value, fu.user_na ...
- python手记(36)
#!/usr/bin/env python #-*- coding: utf-8 -*- #code:myhaspl@qq.com import cv2 import numpy as np fn=& ...
- Android图片裁剪之自由裁剪
我的博客http://blog.csdn.net/dawn_moon 客户的需求都是非常怪的.我有时候在给客户做项目的时候就想骂客户是sb.可是请你相信我,等你有需求,自己变成客户的时候,给你做项目的 ...
- Radio Link Failure and Recovery
四种会发生Radio Link Failure的场景 - DL Physical Layer Failure (PDCCH BLER > 10%) - Random Access Probl ...
- Swift与Objective-C交互
在同一个工程中是可以同时使用Swift和OC的,但不可以同时出现在同一个文件中. OC调用Swift相关信息的方法 在***.m文件中导入工程名-Swift.h即可. 如工程名为ABC,则在需要使用S ...
- android 抽屉式滑动demo
下载地址:https://github.com/asijack/AndroidDrawerDemo 直接上效果图如下: 是不是还不错的样子. 先看看布局文件吧 <android.support. ...
- Windows Server 2003 安装Sql Server 2005 问题处理
安装途中遇到: 问题1.无法找到产品Microsoft SQL Server Native Client的安装程序包.请使用安装包sqlncli.msi的有效副本重新安装? 答:安装SQL Serve ...
- java数据库连接
注意点: 1.所有和数据库相关的(jdbc)包都是java.sql.*: 2.将项目所需的jar包统一复制到web-inf/lib文件夹中. 一:sqlsever数据库 package dbcon; ...
- 使用分析函数实现Oracle 10G提供的CONNECT_BY_ISLEAF和CONNECT_BY_ROOT的功能(转载)
文章转载至:http://blog.csdn.net/wzy0623/article/details/1644049 如果,有侵犯您权益的地方,烦请及时的告知我,我会即刻停止侵权行为 Oracle 1 ...