2017-08-31 462 views
-2

我想寫一個函數,計算一個細菌的種類需要爲其最初的人口達到其最終人口的天數,因爲每一天其人口增加一倍。我的代碼是;Python - 雖然循環簡單

def num_doublings(initial_population, final_population): 
    time = 0 
    while initial_population < final_population: 
     time+= 1 
     initial_population = initial_population * 2 
     print(time) 

這打印每一天,但我希望它只打印while循環停止所需的迭代總數。我的代碼時,函數調用num_doublings(2, 8)輸出是

1 
2 
3 

但我只需要它輸出3.如何解決這個問題?

+3

只需推動'print'語句的左邊,也就是出了'while'的循環。 –

+1

如果您不希望它在每次迭代中都打印,爲什麼在while循環中有打印呼叫? –

+4

爲什麼不使用數學?給定一個公式'x'的權力'y'等於或大於'z',你有'x'和'z',所以你只需要爲'y'解決這個問題。 –

回答

2

你可以試試這個:

def num_doublings(initial_population, final_population): 
    time = 0 
    while initial_population <= final_population: 
     time+= 1 
     initial_population = initial_population * 2 

    return time 

該函數將返回時間變量,它是3,你給

0

你只需要拉while循環外print線的例子。像這樣 -

def num_doublings(initial_population, final_population): 
    time = 1 
    while initial_population < final_population: 
     time+= 1 
     initial_population = initial_population * 2 
    print(time) 

注意,我初始化time =1

0

是範圍問題,只是打印數據時while循環結束:

def num_doublings(initial_population, final_population): 
    time = 0 
    while initial_population < final_population: 
     time+= 1 
     initial_population = initial_population * 2 
    print(time) 
+0

你有三個輸出嗎? –

+0

@ClockSlave,問題的關鍵在於打印函數的範圍,無論哪種方式,如果你更快樂地感覺自己的算法更加聰明,那麼我們歡迎你。 – Netwave

+0

作弊在哪裏呢?我只是指出,你不會得到'3'作爲輸出。這是否意味着作弊?另外,我不是那個壓倒每個人的人。哎呀,我也被壓低了。 –

-1

取消縮進的最後一行。

def num_doublings(initial_population, final_population): 
    time = 0 
    while initial_population < final_population: 
     time+= 1 
     initial_population = initial_population * 2 
    print(time) 
+0

我喜歡所有答案完全相同的事實,但其中一個答覆的人低估了所有其他答案,以推動自己的答案。這就是爲什麼SE有時候這麼糟糕...... – Gnarf

+1

此外,upvoted答案在技術上是錯誤的,因爲問題是如何打印變量,而不是如何返回它。 – Gnarf

+4

除了upvoted回答者還沒有投票的聲望呢。 (不,我沒有在這裏投票)。 –

2

作爲的Martijn Pieters的正確觀察,在高性能的解決方案是不使用循環可言:

from math import log, ceil 

def num_doublings(initial, final): 
    return ceil(log(final/initial, 2))