虽然条件满足但循环不会中断(Collat​​z Sequence)

时间:2017-12-30 09:51:42

标签: python python-3.x while-loop

注意:我试图找出为什么我的while语句在整数结束时没有评估为False,所以我不相信这是重复的

在python中自动执行无聊的练习,程序接收输入并使用以下算法将其减少为1。

#even / 2
#odd * 3 + 1


def collatz():
    print("Enter number:")
    number = input()
    try:
        data = int(number) # Input Validation

        while int(data) != 1:
            if data % 2 == 0: #Number is even
                data = int(data/2)
                print(data)
            if data % 2 == 1: # Number is odd
                data = int(3*data+1)
                print(data)

    except:
        print("Please input a valid value")
        collatz()

collatz()

当数字减少为1时,而不是while循环中断。循环继续,它将1乘以3并加1(与正常奇数一样)。顺便说一下,很多int转换完成了,因为我认为它可能已经返回浮点数。

那么请告诉我在哪里进行unncessary int转换以及如何使用while语句来解除它。任何清理代码都是值得赞赏的

1 个答案:

答案 0 :(得分:2)

为了让您的代码正常运行并且通常更好,您应该做一些事情:

  • (defun c:gmlimport (/ allfiles fpath) (setq allfiles (vl-directory-files "C:\\Users\\Admin\\Documents\\gml2" "*.gml" ) ) (foreach file allfiles (setq fpath (strcat "C:\\Users\\Admin\\Documents\\gml2\\" file)) (gml2dwg "k" fpath) ) (princ) ) 重命名为data,这不会产生太大影响,但我会说它更有意义。
  • 无需向n进行无休止的转换,int只需要从n转换为string 一次
  • 不要将整个代码放在integer中,然后调用一次,而是将主算法放在较小的function中,然后您可以从代码的主体调用,甚至创建另一个function来调用处理输入方面的算法。
  • 使用整数除法运算符(function)而不是浮点除法器(//),因为数字将是偶数,您可以确定小数地点将是/
  • 您无需检查0是否为n % 2,然后在下一行检查0是否为n % 2,您只需使用{{ 1}}子句。

就是这样!这是它的样子:

1

测试显示它有效(输入 if ... else ):

#even / 2
#odd * 3 + 1

def collatz(n):
    while n != 1:
        if n % 2 == 0: #Number is even
            n = n // 2
        else:
            n = n * 3 + 1
        print(n)

number = input("Enter number:")

try:
    number = int(number)
    collatz(number)
except ValueError:
    print("Please input a valid value")