簡體   English   中英

數組遞歸 無法獲得正確的值來返回

[英]Recursion with an Array; can't get the right value to return

找到解決方案-不到5分鍾,謝謝大家!

澄清:我數組的內容是值0-29。 所以array [0] [0] = 0,而array [29] [0] = 29 ---它們只是測試值。 另外,我已經發布了一個潛在的解決方案,請嘗試一下。

遞歸解決方案:不起作用! 說明:一個整數,時間,被傳遞給該函數。 然后用於結束FOR語句( counter<time )。 IF部分( time == 0 )提供了一種基本情況,遞歸應該終止,返回0。ELSE部分是遞歸調用發生的地方:total是在頭文件中定義的私有變量。 在其他地方的構造函數中將其初始化為0。 該函數遞歸地調用自身,一次又一次地將productsAndSales[time-1][0]相加,直到基本調用為止。 然后將總數返回,並在以后打印出來。 好吧,那是我一直希望的。

我想象會發生的事情是,我將把該數組的這一列中的所有值加起來,然后該值將被返回並打印出來。 相反,如果if返回0。如果我將IF部分設置為“ return 1”,我注意到無論返回值是多少,它都會返回2的冪。 EG:時間= 3,則返回2 * 2 +1。如果時間= 5,則返回2 * 2 * 2 * 2 + 1。

我不明白為什么它沒有返回我期望的值。 我想到的一件事是,我試圖在return部分中使用私有變量total以及遞歸調用……也許這是不行嗎?

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

迭代解決方案:有效! 說明:一個整數,時間,被傳遞給該函數。 然后用於結束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;
}

不要使用全局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 ]);
  }
}

現在它也是尾遞歸的。

好吧,在您的遞歸函數中,您希望時間作為函數的參數,但是當您進行遞歸調用時,它傳遞的是productAndSales數組的值,而不是我期望的(time-1)。

因此,假設productAndSales數組的內容不包含零,則永遠不會發生time == 0終止檢查

傳遞了錯誤的論點:

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

應該:

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

應該

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

這將產生與迭代函數相同的結果。

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

無處在你的遞歸解決方案,你實際上添加productsAndSales值-你在這些值傳遞的時間參數的calcTotals()函數。

因此,如果total從零開始,您只是簡單地多次調用此函數,並且從不添加零以外的任何東西。

這不應該是

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);
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM