帮助取消我的C++家庭作业

y2k*_*y2k 1 c++

#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;
    int 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();
}
Run Code Online (Sandbox Code Playgroud)

特别是,twoify()功能似乎是noobis.这是一个鞅赌注模式,基本上每一次失败都会使你之前的赌注加倍,直到你赢了.

Ale*_*lli 5

首先,避免无用的递归,将其转换为迭代:

int twoify(int num, int times)
{
    do {
      num *= 2;
      --times;
    } while (times >= 0);
    return num;
}
Run Code Online (Sandbox Code Playgroud)

但是,你可以做得更好(如果times > 0有保证,这也可以简化上面的版本,允许你使用while而不是do/ while,但是,无论如何......):

int twoify(int num, int times)
{
    return num << (times + 1);
}
Run Code Online (Sandbox Code Playgroud)

这个工作的原因是它相当于将num乘以2乘以(times + 1)次幂,这就是递归和迭代版本都能做到的.