このコードを書くのに苦労しました。数値の配列または引数の配列のいずれかを取り、for
またはwhile
ループを使用せずに平均を計算できる関数を作成することになっています。再帰を使用する必要があると書かれています。どうすればいいですか?
質問する
1068 次
5 に答える
2
皆さんのアドバイスのおかげで無事に終えることができました。皆さんが投稿したものを読むまで、実際の平均計算の仕方について混乱していました。このコードを改善できる場合は教えてください! ありがとう!
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();
})();
}
于 2012-06-22T00:54:44.540 に答える
1
あなたは再帰に精通していると思います。
インデックス引数を使用して再帰関数を実装して、現在の場所を追跡し、同じ変数に数値を追加するだけです。最後に、配列のサイズで割ります。
編集: Kranklin がコメントで指摘しているように、 pop を使用すると、インデックス引数さえ必要ありません。(反復する前に配列のサイズを格納する必要があります)。
于 2012-06-22T00:37:24.453 に答える
1
ここにありますが、それを見ることで、あなたはそれを理解することに同意します:
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
}
};
于 2012-06-22T00:47:53.850 に答える
0
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
于 2012-06-22T00:47:47.007 に答える
0
これが私が思いついたものです:
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()
(または適切な shim ) が利用可能であると仮定します。
于 2012-06-22T01:30:37.603 に答える