2009-11-15 4 views
1
#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(); 
} 

En particulier, la fonction twoify() semble ne pas exister. C'est un modèle de pari martingale, et fondamentalement chaque perte vous doublez votre pari précédent jusqu'à ce que vous gagniez.Aide à annuler mes devoirs en C++

+0

Bien que je ne sois pas d'accord avec l'utilisation d'une instruction return dans votre implémentation de twoify, et son nom (que diriez-vous de doubleN ou similaire?), Je suis content que votre espacement soit cohérent et lisible. C'est très important d'apprendre tôt. – codebliss

+3

N'allez pas à Las Vegas avec cet algorithme. Il est plus rapide et moins risqué de gagner de l'argent en allant au travail. Changeant ou pas. : p – wilhelmtell

+0

J'aime "Un-noobify" et j'ai hâte de le voir bientôt dans les dictionnaires. – pavium

Répondre

5

, éviter la récursion inutile, la transformer en itération:

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

Mais, vous pouvez faire mieux (si times > 0 est garanti, ce qui simplifierait également la version ci-dessus en vous permettant d'utiliser un while au lieu du do/while mais de toute façon ...):

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

La raison pour laquelle cela fonctionne est que cela équivaut à multiplier num par 2 élevé à la (fois + 1) e puissance, ce qui est ce que font les deux versions récursives et itératives.

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

MATH! twoify (5,3) = 2 (2 (2 (5))) = (2^3) * 5 Papy, ton deuxifié (5,0) = 10. Devrait être juste (fois) non (fois + 1) . – codebliss

+0

@codebliss: vous avez tort, c'est le temps + 1 si vous voulez que la fonction sorte comme la fonction de l'OP. – JRL

+0

L'OP de deuxifier (5,0) est également 10. OP – Grandpa

1

On ne sait pas pourquoi deuxify est une méthode récursive. Peut-être que cela a été utilisé pendant la classe pour introduire ou illustrer la récursivité, mais il est clair que ceci pourrait être remplacé par une fonction qui multiplie num par 2 fois. Cela peut être exprimé avec l'opérateur mathématique exponentiation du langage C ou, comme indiqué dans une autre réponse, en effectuant une opération de décalage vers la gauche, en décalant par autant de bits que l'exposant (l'argument "times", ici)

+0

OP voulait «non-notifier» cependant. Pour moi, cela implique, entre autres, d'éliminer l'excès de récursivité. –

Questions connexes