我正在實現一個遞歸函數,用於加速記憶。程序的要點如下:Memoization遞歸C++
我洗牌一副撲克牌(有相同數量的紅色和黑色的牌),並開始面對他們。 之後任何卡可以說「停止」,在這一點上,我支付給你1美元的 每個紅卡處理,你付給我每個黑卡處理1美元。 什麼是您的最佳策略,以及您將爲此遊戲玩 付多少錢?
我的遞歸函數如下:
double Game::Value_of_game(double number_of_red_cards, double number_of_black_cards)
{
double value, key;
if(number_of_red_cards == 0)
{
Card_values.insert(Card_values.begin(), pair<double, double> (Key_hash_table(number_of_red_cards, number_of_black_cards), number_of_black_cards));
return number_of_black_cards;
}
else if(number_of_black_cards == 0)
{
Card_values.insert(Card_values.begin(), pair<double, double> (Key_hash_table(number_of_red_cards, number_of_black_cards), 0));
return 0;
}
card_iter = Card_values.find(Key_hash_table(number_of_red_cards, number_of_black_cards));
if(card_iter != Card_values.end())
{
cout << endl << "Debug: [" << number_of_red_cards << ", " << number_of_black_cards << "] and value = " << card_iter->second << endl;
return card_iter->second;
}
else
{
number_of_total_cards = number_of_red_cards + number_of_black_cards;
prob_red_card = number_of_red_cards/number_of_total_cards;
prob_black_card = number_of_black_cards/number_of_total_cards;
value = max(((prob_red_card*Value_of_game(number_of_red_cards - 1, number_of_black_cards)) +
(prob_black_card*Value_of_game(number_of_red_cards, number_of_black_cards - 1))),
(number_of_black_cards - number_of_red_cards));
cout << "Check: value = " << value << endl;
Card_values.insert(Card_values.begin(), pair<double, double> (Key_hash_table(number_of_red_cards, number_of_black_cards), value));
card_iter = Card_values.find(Key_hash_table(number_of_red_cards , number_of_black_cards));
if(card_iter != Card_values.end());
return card_iter->second;
}
}
double Game::Key_hash_table(double number_of_red_cards, double number_of_black_cards)
{
double key = number_of_red_cards + (number_of_black_cards*91);
return key;
}
第三if語句是代碼的「記憶化」的一部分,它存儲了所有必要的值。保存在地圖中的值可以被認爲是矩陣,這些值將對應於某個#red cards和#black卡。實際上,當我執行總共8張牌的代碼(4個黑色和4個紅色)時,我得到的答案不正確。但是當我執行10張卡片的代碼時,我的回答是錯誤的,但現在我的4個黑色和4個紅色的答案是正確的(8張卡片)!對於12張牌也是如此,我得到了12張牌的錯誤答案,但對於10張牌的正確答案如此等等。代碼中存在一些錯誤,但是,我無法弄清楚。
你爲什麼用'double'來存儲整數? – nneonneo
就這樣,我不認爲這會有什麼區別? –
不,這不會是*問題*(否則我會把它作爲答案),但是對於整數數據使用浮點值通常很糟糕。 – nneonneo