开发者

Help un-noobify my C++ homework

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int twoify(int num, int times)
{
    num *= 2;
    if (times > 0)
    {
        times--;
        return twoify(num, times);
    }
    return num;
}

int main()
{
    srand(time(NULL));
    const int BET = 1;
    const int TIMES = 100000;
    const int CHANCE = 50;

    int wins = 0;
    int losses = 0;
    in开发者_运维知识库t wstreak = 0;
    int lstreak = 0;
    int cwstreak = 0;
    int clstreak = 0;

    for (int i = 0; i < TIMES; i++)
    {
        int num = rand() % 100 + 1;
        if (num <= CHANCE) // win?
        {
            wins++;
            cwstreak++;
            clstreak = 0;
            if (cwstreak > wstreak)
                wstreak = cwstreak;
        }
        else
        {
            losses++;
            clstreak++;
            cwstreak = 0;
            if (clstreak > lstreak)
                lstreak = clstreak;
        }

    }

    cout << "Wins: " << wins << "\tLosses: " << losses << endl;
    cout << "Win Streak: " << wstreak << "\tLoss Streak: " << lstreak << endl;
    cout << "Worst lose bet: " << twoify(BET, lstreak) << endl;

    system("PAUSE");
    cout << endl << endl;
    return main();
}

In particular, the twoify() function seems noobis. This is a martingale bet pattern, and basically every loss you double your previous bet until you win.


First, avoid the useless recursion, turn it into iteration:

int twoify(int num, int times)
{
    do {
      num *= 2;
      --times;
    } while (times >= 0);
    return num;
}

But, you can do better (if times > 0 is guaranteed, which would also simplify the version above by allowing you to use a while instead of the do/while, but, anyway...):

int twoify(int num, int times)
{
    return num << (times + 1);
}

The reason this works is that it's equivalent to multiplying num by 2 raised to the (times + 1)th power, which is what the recursive and iterative versions both do.


int twoify(int num, int times) {
    return num << (times + 1);  // num * 2**(times+1)
}


It's unclear why twoify is a recursive method. Maybe this was used during the class to introduce or illustrate recursion, but clearly this could be replaced by a function which multiplies num by 2^times. This can be expressed with the exponentiation mathematical operator of the C language or, as shown in other response, by doing a left shift operation, shifting by as many bits as the exponent (the "times" argument, here)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜