2014-03-06 29 views
0

這裏是作業:在你的程序中,你將在用戶定義的範圍內驗證這個猜想。您將提示用戶輸入範圍的第一個號碼和最後一個號碼。然後您將檢查兩個數字是否都是正值(> 0),並且用戶定義範圍中的第一個數字小於或等於該範圍中的最後一個數字。如果這些條件中的任何一個或多個失敗,請繼續提示用戶以正確的順序輸入正數。python嵌套循環雹子序列的範圍

一旦範圍的開始和結束已被驗證,您的程序將計算該範圍內每個數字(包括端點)的週期長度。您的程序將打印出具有最大循環長度和該循環長度的數字。

你的樣品會議將是這樣的:

Enter starting number of the range: 1 

Enter ending number of the range: 5 

的3號有7 最長的週期長度在程序中所有的計算將在功能main()。您必須使用嵌套循環來獲得結果。

這裏是我有:

def main(): 
#prompt user to enter starting number of range 
    lo = int (input("Enter starting number of the range: ")) 
#prompt user to enter starting number of range again if input was negative 
    while (lo < 1): 
     print("Error, enter positive number") 
     lo = int(input("Enter starting number of the range: ")) 
#prompt user to enter ending number of range 
    hi = int(input("Enter ending number of the range: ")) 
#prompt user to enter ending number of range again if input was negative 
    while (hi < 1): 
     print("Error, enter positive number") 
     hi= int(input("Enter ending number of the range: ")) 
#set max cycle length and max number 
    max_n = 0 
    max_length = 0 
#Iterate all numbers in the range 
    for n in range(lo, hi + 1): 
     cycle_length = 0 
     while (n != 1): 
      if (n % 2 == 0): 
      n = n/2 
      max_length += 1 
      cycle_length = len(n) 
      else: 
      n = 3 * n + 1 
      max_length += 1 
      cycle_length = len(n) 
      if n == 1: 
      print (n) 
     if (cycle_length > max_length): 
      max_length = cycle_length 
      max_n = n 
#print output 
    print('The number', max_n, 'has the longest cycle length of', str(max_length)) 

有一個邏輯錯誤在這裏的某個地方,我無法找到。 當我嘗試將它稱爲python時,它只是跳過一行並忽略我的文件。

感謝您的幫助!

+0

它哪一行起牀?如果有的話,你的輸出是什麼? –

+0

您正在嘗試創建'len(n)',但n是一個整數,所以它會給你一個錯誤 –

回答

0

我認爲你的第一個問題是你定義了一個main()函數,但從來沒有真正調用它。在運行之前,嘗試在文件底部追加main()

無論如何:一方面,這個練習會迫使你思考loop-inside-loops如何交互;另一方面,這是一種令人難以置信的難以編碼的方式。如果你不需要把所有東西都放在main()中,你可以這樣做:

def get_int(prompt, lo=None, hi=None): 
    while True: 
     try: 
      val = int(raw_input(prompt)) 
      if (lo is None or lo <= val) and (hi is None or val <= hi): 
       return val 
     except ValueError: 
      pass 

def collatz(x): 
    while x > 1: 
     if x & 1: 
      # x is odd 
      x = 3*x + 1 
      yield x 
     # x is now even 
     x //= 2 
     yield x 

def count(iterable): 
    return sum(1 for _ in iterable) 

def main(): 
    lo = get_int("Enter starting number of the range: ", 1) 
    hi = get_int("Enter ending number of the range: ", lo) 

    cx, x = max((count(collatz(x)), x) for x in xrange(lo, hi+1)) 
    print('The number {} has the longest cycle length of {}'.format(x, cx)) 

if __name__=="__main__": 
    main() 

這更容易理解和調試。