2017-04-10 59 views
-4

此代碼片段來自在中學教授的Python課程。該文件導入烏龜,然後隨機,以便在繪製正方形時從列表中選擇顏色。我試圖改變如果到一個while循環,並得到意想不到的結果。循環在num = 0之後繼續,無限期地打印0。我嘗試刪除調用 sqspin(num-1)之外的減量,並在上面的行上執行遞減,如下所示:num = num -1 此更改開始隨機更改每個連續循環的num的打印值在num第一次達到0之後。我不明白爲什麼當num> 0不會在num = 0時終止循環,或者num的隨機值來自哪裏。任何線索? 我正在運行3.4.3,但學校使用2.7。導入隨機影響使用while循環嗎?

from turtle import * 
from random import * 

shape("turtle") 
st() 

def sq(): 
    fd(100) 
    rt(90) 
    fd(100) 
    rt(90) 
    fd(100) 
    rt(90) 
    fd(100) 
    rt(90) 

colors = ['red', 'green', 'orange', 'blue', 'yellow'] 

def pickcolor(): 
    return choice(colors) 

def sqspin(num): 
    print(num) 
    if num > 0: 
     sq() 
     rt(5) 
     mycolor = pickcolor() 
     pencolor(mycolor) 
     sqspin(num-1) 

sqspin(5) 
+0

爲什麼添加行號? –

+1

因爲你永遠不會改變'num'!您在遞歸調用中傳遞'num-1',但不會在調用者中更改'num'。 –

+0

什麼是'sq'?我錯過了什麼嗎? –

回答

0

你可以做你的建議是什麼,但只是改變了ifwhile是不夠的。在那裏你會感到困惑的是遞歸迭代之間的差異。該算法是目前遞歸,使其迭代,我們可以:

def sqspin(num): 
    while num > 0: 
     print(num) 
     sq() 
     rt(5) 
     pencolor(pickcolor()) 
     num -= 1 

需要注意的是,除了if成爲while,我們消除了遞歸調用sqspin()和內環路,而不是遞歸調用內遞減num參數。 (並將print(num)移到循環中,以便它可以執行它的原始目的。)

+0

感謝您的建設性迴應..遞歸調用創建了一個我沒有考慮過的問題,當我將其更改爲while循環時。我現在更好地理解if和while的用法的區別。 –