スピードアップのためにメモ化を伴う再帰関数を実装していました。プログラムのポイントは次のとおりです。
私は(赤と黒のカードの数が同じである)カードのデッキをシャッフルし、それらを表向きに配り始めます。カードの後で「やめる」と言うことができます。その時点で、私はあなたに赤のカードが配られるごとに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;
}
3番目のifステートメントは、コードの「メモ化」部分であり、必要なすべての値を格納します。マップに保持されている値はマトリックスと考えることができます。これらの値は、特定の#redカードと#blackカードに対応します。本当に厄介なのは、合計8枚のカード(黒4枚と赤4枚)のコードを実行すると、間違った答えが返ってくるということです。しかし、10枚のカードのコードを実行すると、私の答えは間違っていますが、4つの黒と4つの赤の答えは正しいです(8枚のカード)!同じことが12枚のカードにも言えます。12枚のカードでは間違った答えが返ってきますが、10枚のカードでは正解です。コードにバグがありますが、わかりません。