递归函数式编程困境

时间:2015-03-20 23:49:33

标签: javascript loops recursion functional-programming

以下是我在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)

3 个答案:

答案 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;
  }