美文网首页
一个数最终会回到1

一个数最终会回到1

作者: Callme_Agnes | 来源:发表于2018-06-21 10:32 被阅读0次

    才开始学python不久,今天看到了一个很有趣的作业,花费了一个多小时,终于把它写出来 。当我屁颠屁颠发给刘凯林时候,他问我,你做笔记了吗?我楞了一下,什么是笔记?他说,一个好的程序员,应该要把你学到的记录下来,方便以后翻阅,而不是每当完成一个作品,就自高自大地炫耀,过后什么都忘掉。好吧,那我一直都很自高自大呢。听说简书不错,这段话就当啰嗦的开场白吧。

    以下是看到的一个练习:


    image.png

    使用python写,对于老手应该很简单,不用几句就可以写出来,我也是新手,不简单,用了很多句,也写出来了,如下:

    #一个数最后终究会回到1
    while(True):
        print('please input a int number:')
        guess = input()                                  #这里的guess接收输入的任何字符
        def collatz(number):                             #传入的guess即是number
            x=number%2      
            if x == 0:    
                number = number//2
            else :
                number = 3*number+1
            print(+number)
            return number
            
        while(True):
            try:
                guess = int(guess)                       #将guess做int处理,如果不是int类型,会报错
                if (guess) == 1:                         #判断传入的guess是否为1,是的话直接打印跳出
                    print("The final is:" +str(guess) )
                    break
                else:
                    guess = collatz(guess)               #不是1的话调用函数执行,函数将number返回,继续当做guess使用
            except ValueError:                           #异常处理,注意跳出,不然会一直在while函数
                print('Wrong!please input a int number!')
                break
    

    一开始总是报错,主要报错点有以下几点:

    1.不知道在哪里加入try和except,如何判断输入的数是整数

    2.不知道把input函数放哪里

    3.参数传递的时候,不懂设置循环调用,如何触发跳出循环

    对于以上几点的解决方法:

    1.A.按照练习要求,如果用户输入非整数,那么会提示报错。。所以输入的字符类型判断必须在try语句里,当字符类型判断出错,直接跳到except的ValueError的异常。在这里使用了guess=int(guess),括号里面的guess的包含所有类型的用户输入,将之转成int类型,成为一个新的guess,而如果转化不了成int类型,说明用户输入的字符类型不是数字,那么就会直接异常进入ValueError(有点像if else)

    B.整个代码的主体计算在于:如果判断输入属于整数,根据奇偶数进行计算。所以我把try except放在主函数里了,而没有放在函数collatz里,在collatz里放的是数值的计算转化

    1. 一开始在try后面跟着是这一句 guess = int(input()) ,虽然一开始就在输入时候对数据类型进行转化,但是由于try是存在在循环的while里面的,这样每一次循环,guess都要重新输入,计算出来的guess会被输入的guess代替,达不到不停调用不停计算的结果(你想啊你输入一个44就只能计算到22了,不会再往下),没意义。因此先把input放在外面,在里面再对输入的值做处理。

    3.参数传递时候,使用:guess = collatz(guess)。括号的guess传给number,number计算后再将值给到前面新的guess,这个guess再作为一个新的值,重新回到括号里传给number,达到不停循环调用的效果。当guess==1或者输入的字符不为数字,直接break出循环,回到外围大圈重新再来一遍(外围的大循环是一个死循环)

    运行结果部分截图如下:

    please input a int number:
    1
    The final is:1
    please input a int number:
    23
    70
    35
    106
    53
    160
    80
    40
    20
    10
    5
    16
    8
    4
    2
    1
    The final is:1
    

    一个数最终会回到1,这是一个数学家都解释不了的问题。这让我不仅想到,一个人无论多有成就多有辉煌,最终还是会回归尘土的吧。

    那如果我把这个1定为,回归自然逻辑,世界万物真理的尘土,无论我现在如何挣扎仰望,我终究会走到那一步的吧。写代码没那么难的,当理解了之后,很多都会融会贯通。你们说对吧,对吧,加油啊Agnes。

    相关文章

      网友评论

          本文标题:一个数最终会回到1

          本文链接:https://www.haomeiwen.com/subject/gxhqyftx.html