JavaScript 挑战:使用递归创建一个平均计算函数

JavaScript challenge: Create an average-calculating function using recursion?

本文关键字:一个 函数 计算 挑战 创建 递归 JavaScript      更新时间:2023-09-26

我在编写这段代码时遇到了麻烦。我应该创建一个函数,它可以接受数字数组或参数数组,并在不使用forwhile循环的情况下计算平均值。它说我必须使用递归。我该怎么做?

亏了你们的建议,我才能自己完成它。在阅读你们发布的内容之前,我对如何进行实际平均计算感到困惑。如果此代码可以改进,请告诉!谢谢!

function mean( list, more ) {
    if ( more ) {
        list = [].slice.call( arguments );
    } else if ( !list || list[0] === undefined ) return;
    var a = list,
        b = list.length;

    return (function execute() {
        if ( !a.length ) return 0;
        return ( a.pop() / b ) + execute();
    })();
}

我假设你熟悉递归。

只需使用索引参数实现一个递归函数即可跟踪您所在的位置,并将数字添加到同一变量中。然后在最后,除以数组的大小。

编辑:正如Kranklin在评论中指出的那样,使用pop你甚至不需要index参数。(在迭代之前,您需要存储数组的大小)。

在这里,

但通过查看它,您同意理解它

http://jsfiddle.net/sparebyte/kGg9Y/1/

function calcAverage(nums, total, count) {
    if(isNaN(count)) {
        // First iteration: Init Params
        return calcAverage(nums, 0, nums.length);
    }
    if(nums.length) {
        // Middle itrations: Get a total
        total = nums.pop() + total;
        return calcAverage(nums, total, count)
    } else {
        // Last iteration: Find the total average
        return total / count     
    }
};
function average(set, memo, total) {
  memo || (memo = 0);
  total || (total = set.length);
  if (set.length === 0) return memo / total;
  return average(set.slice(1, set.length), (memo + set[0]), total);
}

你这样称呼它:

average([1,2,3,4]); // 2.5

这是我想到的:

function av(nums, i, t) {
   if (!Array.isArray(nums))
       return av([].slice.call(arguments));
   if (t === void 0){
       if (nums.length === 0)
          return;
       return av(nums, nums.length-1, 0);
   }
   t += nums[i];   
   if (i > 0)
       return av(nums, i-1, t);
   return t / nums.length;
}

接受数字数组,或者如果第一个参数不是数组,则假定所有参数都是数字。(对非数字数据(如 av('a','x'))没有错误检查。如果数组为空或未提供参数,则返回undefined

alert( av([1,2,3,4]) );   // 2.5
alert( av(1,2,3,4,5) );   // 3

假设Array.isArray()(或适当的填充程序)可用。