2009-11-15 47 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(); 
} 

特別是,twoify()函數似乎noobis。這是一個鞅賭注模式,基本上每次損失都會讓你以前的賭注加倍,直到你贏。幫助解除我的C++作業

+0

雖然我不同意你的執行twoify的使用return語句,它的名字(怎麼樣doubleN或相似?),我很高興你的間距是一致的和可讀性。這對於儘早學習非常重要。 – codebliss 2009-11-15 03:39:55

+3

不要用這種算法去拉斯維加斯。只要去工作賺錢速度更快,風險更小。是否移動。 :p – wilhelmtell 2009-11-15 03:44:31

+0

我喜歡「Un-noobify」,期待很快在字典中看到它。 – pavium 2009-11-15 04:06:01

回答

5

第一,避免無用的遞歸,把它變成迭代:

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

但是,你可以做的更好(如果times > 0得到了保證,這也將簡化以上版本允許您使用的while代替do/while ,但無論如何...):

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

這部作品的原因是,它是相當於乘以2 NUM提升到(次+ 1)次方,這就是遞歸和迭代版本都這樣做。

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

數學! twoify(5,3)= 2(2(2(5)))=(2^3)* 5 爺爺,您的twoify(5,0)= 10。應該只是(倍)不是(倍+ 1) 。 – codebliss 2009-11-15 03:37:30

+0

@codebliss:你錯了,如果你希望函數輸出與OP的函數相同的值,那麼就是+1。 – JRL 2009-11-15 03:42:12

+0

OP的twoify(5,0)也是10. – Grandpa 2009-11-15 03:44:25

1

現在還不清楚爲什麼二化是遞歸方法。也許這是在課堂上用來介紹或說明遞歸,但顯然這可以用一個函數來代替,這個函數將num乘以2 ^次。這可以用C語言的求冪運算符來表示,或者如其他響應所示,通過執行左移操作,移位與指數(這裏的「times」參數)相同的位數

+0

OP想要「un-noobify」。對我來說,除其他外,消除多餘的遞歸。 – 2009-11-15 03:28:56