以下是我在JavaScript中的代码。底部的循环回答是正确的答案。
我的递归版本不正确,当索引为3且数组长度为3时,计算机仍然输入if语句,这是不合逻辑的...为什么?如果3不小于3,则计算机不应输入if语句。帮我修复递归答案。循环是正确和精细的,应该保持不变。
var data = [
{
name: "Jamestown",
population: 2047,
temperatures: [-34, 67, 101, 87]
},
{
name: "Awesome Town",
population: 3568,
temperatures: [-3, 4, 9, 12]
},
{
name: "Funky Town",
population: 1000000,
temperatures: [75, 75, 75, 75, 75]
}
];
递归回答
function john( arr, i, j, total, coord)
{
var total = total || 0;
var coord = coord || [];
if(i < arr.length)
{
if(j < arr[i].temperatures.length)
{
total = arr[i].temperatures[j] + total;
john(arr, i, j + 1, total, coord)
}
ave = total / arr[i].temperatures.length;
total = 0;
coord.push([ave, arr[i].population])
john(arr, i + 1, 0, total, coord)
}
return coord;
}
console.log("recursion answer(it is wrong) is")
console.log( john(data, 0, 0, 0))
循环回答
var coords = [],
totalTemperature = 0,
averageTemperature = 0;
for (var i=0; i < data.length; i++) {
totalTemperature = 0;
for (var j=0; j < data[i].temperatures.length; j++) {
totalTemperature += data[i].temperatures[j];
}
averageTemperature = totalTemperature / data[i].temperatures.length;
coords.push([averageTemperature, data[i].population]);
}
console.log("correct answer is this loop answer ...")
console.log(coords)
答案 0 :(得分:1)
您无法通过对同一函数的两次递归调用来替换嵌套循环。
当您使用i, j + 1
调用该功能时,它不会仅为j
执行以下值的调用,它还会调用{{1}的以下值}。当您使用i
拨打电话时,它不会只为i + 1, j
拨打以下电话号码,它也会调用i
的以下值。
而不是获得看起来像这样的一连串调用:
j
你得到的东西看起来像这样:
0,0
0,1
0,2
0,3
1,0
1,1
1,2
1,3
2,0
2,1
2,2
2,3
2,4
此外,它不会在每个0,0
0,1
0,2
0,3
0,4
1,0
1,1
1,2
1,3
2,0
2,1
2,2
2,3
2,4
2,0
2,1
2,2
2,3
2,4
2,0
2,1
2,2
2,3
2,4
2,0
2,1
2,2
2,3
2,4
1,0
1,1
1,2
1,3
2,0
2,1
2,2
2,3
2,4
2,0
2,1
2,2
2,3
2,4
2,0
2,1
2,2
2,3
2,4
2,0
2,1
2,2
2,3
2,4
1,0
1,1
1,2
1,3
2,0
2,1
2,2
2,3
2,4
2,0
2,1
2,2
2,3
2,4
2,0
2,1
2,2
2,3
2,4
2,0
2,1
2,2
2,3
2,4
1,0
1,1
1,2
1,3
2,0
2,1
2,2
2,3
2,4
2,0
2,1
2,2
2,3
2,4
2,0
2,1
2,2
2,3
2,4
2,0
2,1
2,2
2,3
2,4
1,0
1,1
1,2
1,3
2,0
2,1
2,2
2,3
2,4
2,0
2,1
2,2
2,3
2,4
2,0
2,1
2,2
2,3
2,4
2,0
2,1
2,2
2,3
2,4
值范围的末尾推送结果,而是会为每次调用推送结果。
答案 1 :(得分:-1)
///递归回答
function john( arr, i, j, total, coord)
{
var total = total || 0;
var coord = coord || [];
if(i < arr.length)
{
if(j < arr[i].temperatures.length)
{
total = arr[i].temperatures[j] + total;
john(arr, i, j + 1, total, coord)
}
ave = total / arr[i].temperatures.length;
total = 0;
coord.push([ave, arr[i].population])
return john(arr, i + 1, 0, total, coord)
}
return return coord;
}
答案 2 :(得分:-1)
///递归回答
function john( arr, i, j, total, coord)
{
var total = total || 0;
var coord = coord || [];
if(i < arr.length)
{
if(j < arr[i].temperatures.length)
{
total = arr[i].temperatures[j] + total;
john(arr, i, j + 1, total, coord)
}
ave = total / arr[i].temperatures.length;
total = 0;
coord.push([ave, arr[i].population])
// it need return john(arr, i + 1, 0, total, coord)
// cannot be john(arr, i+1, 0, total, coord)
return john(arr, i + 1, 0, total, coord)
}
return coord;
}