函数的传值实例(递归,阶乘,排序)

前一篇简单了介绍了一下函数的传值,知道了函数本身可以当做另外一个函数的参数场地进去。这里在介绍一个函数传值的实例:

function fn(num1){

function fn1(num2){

return (num2+num1)

}

return fn1

}

var fn3=fn(20);

alert(fn3(11));

alert(fn3);

这里第一个返回的就是31,第二个返回的是fu的定义函数。

在这里我么可以这样理解:函数的第一层就是让设置参数的一层,var fn3=fn(20);这里就是申请了一个参数为20的函数,然后再在这个函数的基础之上发挥功能,当然还是利用刚在申请的函数喽。所以要显示的就是fn3(),括号里面的就是第二个参数。

这样看来,函数在使用过程中需要两个参数的定义。第一个就是最外层的参数,这是后来使用函数的基础。我的理解是用fn3实现了一个特定函数的占位。后来再使用的时候,直接调用占位函数,占位函数也需要一个参数,这个参数就是第二个参数。

下面总结一下sort函数的使用:

Sort函数是对字符串进行排序的一个函数,但是在使用过程中还需要注意很多东西。

var as=[1,3,2,5,6333,9,4];

as.sort();

alert(as);

结果表明,对于sort函数而言,如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。

结果是:

1,2,3,4,5,6333,9

很明显,这不是我们想要的结果。

改进:

function sortbynum(a,b){

return (a-b)

}

var as=[1,3,2,5,6333,9,4];

as.sort(sortbynum);

alert(as);

这里就会返回正常的顺序。

下面举一个稍微复杂点的例子:

这里定义一个Person类,实现类的排序:

function Person(name,age){

this.name=name;

this.age=age

}

var person1=new Person("zhou",33);

var person2=new Person("chen",27);

var person3=new Person("tian",45);

var persons=[person1,person2,person3];

persons.sort(sortbyage);

function sortbyname(obj1,obj2){

if(obj1.name>obj2.name)

return 1;

else if(obj1.name<obj2.name)

return -1;

else return 0;

}

function sortbyage(obj1,obj2){

return obj1.age-obj2.age

}

function show(){

var con=document.getElementById("per");

//alert(con);

for(var i=0;i<persons.length;i++)

con.innerHTML+=persons[i].name+","+persons[i].age+"<br/>";

}

show();

这个部分可以根据sort()括号里面的参数来实现根据name还是age的排序。结果喜人。

但是这个还不够,这样的话,如果这个类有一百个属性,我们难不成还要写一百个函数然后手动测试咩?

于是我们可以利用函数传值的原理简化这个过程;

原理如下,但是还在debug中……

function sortbyproperty(propertyname){

alert(propertyname);

function sortfun(obj1,obj2){

if (obj1.propertyname>obj2.propertyname)

return 1;

else if (obj1.propertyname<obj2.propertyname)

return -1;

else return 0;

}

return sortfun;

}

persons.sort(sortbyproperty(‘age‘));

这个函数足以取代我们原来根据一个属性一个方法的设想,只是在调用的时候,需要Person.sort(sortbypropername(……));来进行调用。

下面简单说一下函数的几个简单属性arguments和this:

关于arguments

function fun(sum){

alert(arguments.length);

for(var i=0;i<arguments.length;i++)

alert(arguments[i])

}

fun(1,2,3,4,5,6);

arguments可以把所有的参数读取到arguments这个数组里面。有length属性,可以使用arguments[]调用。

在arguments中,有一个callee属性,js中实现递归基本上就是靠这个属性

普通递归arguments

function digui(sum){

if (sum<=1)

return 1;

else

return sum*digui(sum-1)

}

alert(digui(99));

缺陷:

var fun=digui;

fun(3);

digui=null;

就会报错。因为此时fun这个函数依然使用digui这个函数来调用,但是digui这个函数已经指向null,就会报错。下面解开耦合(利用arguments的callee属性)

function digui(sum){

if (sum<=1)

return 1;

else

return sum*arguments.callee(sum-1)

}

alert(digui(99));

时间: 2024-08-01 07:17:18

函数的传值实例(递归,阶乘,排序)的相关文章

PHP有关函数的编程思想(递归与迭代)

PHP有关函数的编程思想(递归与迭代) 递归思想(递归函数): 递归思想的一个基本形式是:在一个函数中,有至少一条语句,会去调用该函数自身. 但是从代码角度来说,如果单纯是函数内部调用函数,则会出现"出不来"的现象. 则我们就必须再来解决下一个问题:怎么终止(停止)这种自身的调用 -- 找到递归函数的出口 案例分析:写一个递归函数,该函数可以计算一个正整数的阶乘 数学基础: A:1的阶乘是1 B:大于1的数的阶乘是这个数减1的数的阶乘,乘以该数的结果. 比如:要求6的阶乘:则定义一个函

数据结构与算法—递归(阶乘、斐波那契、汉诺塔)

目录 递归介绍 递归求阶乘 递归求斐波那契 递归解决汉诺塔 总结 递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单:递归通常可以简单的处理子问题,但是不一定是最好的.对于递归要分清以下概念: 自己调用自己 递归通常不在意具体操作,只关心初始条件和上下层的变化关系. 递归函数需要有临界停止点,即递归不能无限制的执行下去.通常这个点为必须经过的一个数. 递归通常能被其他方案替代(栈.数组正向求). 认识递归,递归函数通常简易但是对于初学者可能很难取理解它.拿一个递归

JavaScript中字符串分割函数split用法实例

这篇文章主要介绍了JavaScript中字符串分割函数split用法,实例分析了javascript中split函数操作字符串的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了JavaScript中字符串分割函数split用法.分享给大家供大家参考.具体如下: 先来看下面这段代码: <script type="text/javascript"> var str="How are you doing today?" document.write

PHP 函数dirname()使用实例

通常在配置文件路径的时候用dirname(__FILE__)是非常有效的方法,但是因为__FILE__的路径是当前代码所在文件(而不是url所在文件)完整路径,所以定义配置文件通常要放在根目录下定义网站的根地址,但是下面的方法可以解决配置文件的存放问题. dirname(dirname(__FILE__)); /* 假设__FILE__为 /home/web/config/config.php 上面的方法输出为 /home/web */ dirname(dirname(__FILE__));得到

反向传值实例

反向传值实例 1.代理反向传值 #import <UIKit/UIKit.h> //声明一个类 @class LHTableViewController; //声明一个协议 @protocol LHTableViewControllerDelegate <NSObject> //协议中的方法 -(void)LHTablieViewController:(LHTableViewController *)LHTablieViewController Color:(UIColor *)c

golang的slice作为函数参数传值的坑

直接贴代码 func sliceModify(slice []int) { // slice[0] = 88 slice = append(slice, 6) } func main() { slice := []int{1, 2, 3, 4, 5} sliceModify(slice) fmt.Println(slice) } 返回的没变,坑爹的,这个设计太那啥了,可以正确跑出效果的版本如下: func sliceModify(slice *[]int) { *slice = append(*

scheme实现匿名递归阶乘(Y组合子)

(((lambda ()         ((lambda (f)        (f f))      (lambda (x)        ((lambda (y)           (lambda (n)             (if (zero? n)                 1                 (* n (y (- n 1)))))) (lambda z                                        (apply (x x) 

C# 函数的传值与传址(转)

http://www.cnblogs.com/mdnx/archive/2012/09/04/2671060.html using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { /* 先来了解一下什么是实参, 什么是形参. 所谓形参其实也就是说函数定义的时候所带的参数. 比如 static

MySQL 自定义函数CREATE FUNCTION实例

分享一个MySQL 自定义函数CREATE FUNCTION的实例.mysql> delimiter $$mysql> CREATE FUNCTION myFunction-> (in_string VARCHAR(255),-> in_find_str VARCHAR(20),-> in_repl_str VARCHAR(20))->-> RETURNS VARCHAR(255)-> BEGIN-> DECLARE l_new_string VARC