![]() |
#2
qq10235692232011-03-21 21:40
|

/**
* @method sum1 求和函数
* @param a { Number } 参数1
* @param b { Number } 参数2
* @return { Number } 两个参数的和
*/
function sum1(a,b){
return a+b;
}

/**
* @method sum2 求和函数
* @param list { Array } 一个列表
* @return { Number } 列表中所有元素的和
*/
function sum2(list){
var s = 0;
for(var i=0;i<list.length;i++){
s = s + list[i]; //也可写为 s += list[i];
}
return s;
}
var list = [1,2,3];
alert(sum2(list));

/**
* @method sum 求和函数
* @param ... 若干参数
* @return { Number } 所有形参的和
*/
function sum3(){
var s = 0;
for(var i=0;i<arguments.length;i++){
s = s + arguments[i]; //也可写为 s += arguments[i];
}
return s;
}

/**
* @method sum4 求和函数
* @param a { Number } 参数1
* @param b { Number } 参数2
* @return { Number } 两个参数的和
*/
function sum4(a, b){
return a+b;
}
/**
* @method sum4 求差函数
* @param a { Number } 参数1
* @param b { Number } 参数2
* @return { Number } 参数1和参数2的差
*/
function sub(a, b){
return a-b;
}
/**
* @method trans_multi 将函数转换为多参数版本
* @param fn {Function} 待转换函数
* @return {Function} 转换后的函数
*/
function trans_multi(fn){
return function(){
var args = arguments;
var first = args[0];
for(var i=1;i<args.length;i++){
first = fn(first, args[i]);
}
return first;
}
}
var multi_sum = trans_multi(sum4);
var multi_sub = trans_multi(sub);
alert(multi_sum(1,2,3));
alert(multi_sub(3,2,1));

/**
* @method sum5 递归求和函数(依靠栈保存累加值)
* @param ... 多个形参
* @return { Number } 形参的和
*/
function sum5(){
var args = Array.prototype.slice.call(arguments);
if(args.length){
return args[0] + sum5.apply(null, args.slice(1));
}else{
return 0;
}
}
alert(sum5(1,2,3));
/**
* @method sum6 递归求和函数(依靠参数保存累加值)
* @param ... 多个形参
* @return { Number } 形参的和
*/
function sum6(list, sum){
if( !(list instanceof Array) ){
return sum6.call(null, Array.prototype.slice.call(arguments), 0);
}else{
if(list.length){
return sum6(list.slice(1), list[0]+sum);
}else{
return sum;
}
}
}
alert(sum6(1,2,3));
/**
* @method plat_recursive 递归平坦化
* @param fn {Function} 递归函数
* @return {Any} 将递归平坦化后的返回值
*/
function plat_recursive(fn){
return function(init){
var i=0, args=Array.prototype.slice.call(arguments), len=args.length;
if(!init){
for(; i<len; i++){
if(i in args){
init = args[i];
break;
}
}
}
i+=1;
for(; i<len; i++){
init = fn(init, args[i]);
}
return init;
};
}
var plat_sum5 = plat_recursive(sum5);
var plat_sum6 = plat_recursive(sum6);
alert(plat_sum5(1,2,3));
alert(plat_sum6(1,2,3));
[ 本帖最后由 chaoslee 于 2011-5-16 13:33 编辑 ]