[英]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.