1101170728 发表于 2023-12-9 22:17

【纯小白】自学Python,下面编程算是自己写的第一个Python代码

本帖最后由 1101170728 于 2023-12-9 23:23 编辑

纯小白一个,自学Python没多久,有一道练习题,自己调试了好久,才调试出来。不知道有没有更好的写法,特来求大神指导一下。
这算是自己写的第一个Python代码
题目如下:
    编写一个名为collatz()的函数,它有一个名为number 的参数。如果参数是偶数,那么collatz()就打印出number // 2,并返回该值。如果number 是奇数,collatz()就打印并返回3 * number + 1。
    然后编写一个程序,让用户输入一个整数,并不断对这个数调用collatz(),直到函数返回值1



自己码的代码,调试了好久才跑通.......
https://z1.ax1x.com/2023/12/09/piRir5T.jpg


结果为
http://n9364.bvimg.com/21214/fa8f10f88421d749.jpg







苏紫方璇 发表于 2023-12-10 09:23

感觉楼主写的不对呦,我的理解是用户只输入一次数,循环调用函数,参数是上一次调用的返回值,直到返回值是1

sai609 发表于 2023-12-10 09:52

collatz(),这里错了

vethenc 发表于 2023-12-10 10:20

本帖最后由 vethenc 于 2023-12-10 10:31 编辑

```python

# collatz2.py

def collatz():
    num= eval(input("请输入一个正整数:"))
    while True:
      if num == 0:
            print("你输入了一个非正整数!")
            break
      if num == 1:
            break
      if num % 2 == 0 :
            num = num // 2
            print(num)
      else:
            num = 3 * num + 1
            print(num)

            

for i in range(5):
    collatz()
```

疑问:为啥输入小数也能正常退出?

surepj 发表于 2023-12-10 10:23

是不是这样调用更好一些:
def collaz(number):
    if number % 2 == 0:
      return number // 2
    else:
      return 3 * number + 1

while True:
    number = int(input("Enter a int number:"))
    res = collaz(number)
    print(res)

aixiaodemj 发表于 2023-12-10 12:57

#定义collatz函数
def collatz(number):
    if number % 2 == 0:
      result = number // 2
    else:
      result = 3 * number + 1

    print(result)
    return result


# main函数
def main():
    try:
      number = int(input("请输入一个整数: "))
      while number != 1:
            number = collatz(number)
    except ValueError:
      print("请输入一个有效的整数!")


main()

zhuxiangyu1024 发表于 2023-12-10 16:59

典型的递归题目,各位不要搞错了全在while。

1101170728 发表于 2023-12-10 20:05

苏紫方璇 发表于 2023-12-10 09:23
感觉楼主写的不对呦,我的理解是用户只输入一次数,循环调用函数,参数是上一次调用的返回值,直到返回值是 ...

程序是能跑通,不过也有bug,如果输入0和负数,也是有问题的,需要再完善一下

1101170728 发表于 2023-12-10 20:14

vethenc 发表于 2023-12-10 10:20
```python

# collatz2.py


跑了一下,觉得可以把for i in range(5):删除,

1101170728 发表于 2023-12-10 21:22

本帖最后由 1101170728 于 2023-12-10 21:26 编辑



感谢#6 楼主,受#6 楼主启发,完善了一些,杜绝了一些小bug




#定义 collaz()函数
def collaz():
    while True:
      if number == 1:
            break
      if number % 2 == 0 :
            number = number // 2
            print(number)
      elif number % 2 == 1:
            number = 3*number + 1
            print(number)

#定义 main()函数
def main():
    while True:
      try:
            number = int(input("请输入一个正整数: "))
            if number <= 0:
                print("请输入一个有效的正整数:")
                continue
            while number != 1:
                number = collatz(number)
            break
      except ValueError:
            print("请输入一个有效的正整数!")
main()



输出结果:

https://z1.ax1x.com/2023/12/10/piRWsRH.png
页: [1] 2
查看完整版本: 【纯小白】自学Python,下面编程算是自己写的第一个Python代码