python嵌套循环hailstone序列的范围

时间:2014-03-06 03:17:17

标签: python

这是作业:在你的程序中,你将在用户定义的范围内验证这个猜想。您将提示用户输入范围的第一个数字和最后一个数字。然后,您将检查两个数字是否均为正(> 0),并且用户定义范围中的第一个数字小于或等于该范围中的最后一个数字。如果任何一个或多个条件失败,请继续提示用户以正确的顺序输入正数。

一旦验证了范围的开始和结束,您的程序将计算该范围内每个数字的周期长度,包括终点。您的程序将打印出具有最大循环长度的数字以及循环长度。

您的示例会话将如下所示:

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中时,它只是跳过一行而忽略了我的文件。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我认为你的第一个问题是你定义了一个main()函数但从未实际调用它。尝试在运行之前在文件底部附加main()

无论如何:一方面,这个练习迫使你思考循环内循环如何相互作用;另一方面,它是一种非常丑陋的编码方式。如果你不必把所有东西放在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()

更容易理解和调试。