使用数组递归;无法获得正确的回报价值

时间:2010-03-16 16:44:38

标签: c++ arrays recursion return

找到解决方案 - 在5分钟内完成,谢谢大家!

澄清:我的数组的内容是值0-29。所以数组[0] [0] = 0,而数组[29] [0] = 29 ---它们只是测试值。此外,我有一个潜在的解决方案,已经多次发布,试试这个。

递归解决方案:无效! 说明:将整数time传递给函数。然后它用于提供FOR语句的结尾(counter<time)。 IF部分(time == 0)提供了一个基本情况,递归应该终止,返回0. ELSE部分是递归调用发生的地方:total是头文件中定义的私有变量,在别处。它在其他地方的构造函数中初始化为0。该函数以递归方式调用自身,再次将productsAndSales[time-1][0]添加到total,直到基本调用。然后返回总数,然后打印出来。嗯,这就是我所希望的。

我想象的是,我会在数组的这一列中添加所有值,并返回值并打印出来。相反,如果返回0.如果我将IF部分设置为“返回1”,我注意到它返回2的幂,对于任何值时间。 EG:时间= 3,返回2 * 2 + 1.如果时间= 5,则返回2 * 2 * 2 * 2 + 1.

我不明白为什么它没有返回我期待的价值。我想到的一件事是,我试图在返回部分使用私有变量total,以及递归调用...也许这是不可能的某种方式?

int CompanySales::calcTotals( int time )
{
  cout << setw( 4 );
  if ( time == 0 )
   {
    return 0;
   }
  else
   {
    return total += calcTotals( productsAndSales[ time-1 ][ 0 ]);
   }
}

迭代解决方案:工作! 说明:将整数time传递给函数。然后它用于提供FOR语句的结尾(counter<time)。 FOR语句循环遍历数组,将一列中的所有值一起添加。然后返回该值(以及程序中的其他位置,打印出来)。效果很好。

int CompanySales::calcTotals( int time )
{
 int total = 0;
 cout << setw( 4 );

 for ( int counter = 0; counter < time; counter++ )
 {
  total += productsAndSales[counter][0];
 }
 return total0;
}

7 个答案:

答案 0 :(得分:6)

不要使用全局total,将其作为参数。

int totals = calcTotals(time-1, 0); // Call it starting at the end, 
                                    // so we don't have to pass along the `time`


int CompanySales::calcTotals( int counter, int total )
{
  if ( counter == 0 ) {
    return total;
  }
  else {
    return calcTotals(counter - 1, total + productsAndSales[counter][ 0 ]);
  }
}

现在它的尾部也是递归的。

答案 1 :(得分:3)

好吧,在你的递归函数中,你期望时间作为函数的参数,但是当你进行递归调用时,它会传递productsAndSales数组的值,而不是我预期的(时间 - 1)

因此,假设productAndSales数组的内容不包含零,则永远不会发生time == 0终止检查

答案 2 :(得分:2)

传递错误的论据:

total += calcTotals( productsAndSales[ time-1 ][ 0 ]);

应该是:

total +=  productsAndSales[ time ][ 0 ]  + calcTotals(time - 1);

答案 3 :(得分:1)

应该是

return total += productsAndSales[time - 1][0] + calcTotals(time - 1);

答案 4 :(得分:1)

这应该产生与迭代函数相同的结果。

int CompanySales::calcTotals( int time )
{
  cout << setw( 4 );
  if ( time == 0 ){
    return 0;
  }
  else{
    return productsAndSales[time-1][ 0 ] + calcTotals( time - 1 );
  }
}

答案 5 :(得分:0)

您的递归解决方案中没有任何地方实际添加productsAndSales值 - 您将这些值作为时间参数传递给calcTotals()函数。

因此,如果总计从零开始,则只需多次调用此函数,并且不会向其中添加除零之外的任何内容。

答案 6 :(得分:0)

不应该是

int CompanySales::calcTotals( int time )
{
  int total = 0;
  cout << setw( 4 );
  if ( time == 0 )
   {
    return 0;
   }
  else
   {
    return total += productsAndSales[ time ][ 0 ] + calcTotals( time - 1);
   }
}