我正在实现一个递归函数,用于加速记忆。程序的要点如下: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