找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 10103|回复: 12

[代码与实例] Collatz序列

1

主题

15

帖子

15

积分

贫民

积分
15
苍雪明南 发表于 2016-12-5 21:39:59 | 显示全部楼层 |阅读模式
编写一个名为collatz()的函数,它有一个名为number的参数。如果参数是偶数,那么collatz()就打印出number//2,并返回该值。如果number是奇数,collatz()就打印并返回3*number+1。然后编写一个程序,让用户输入一个整数,并不断对这个数调用collatz(),直到函数返回值1.大家有没有好的思路?


我写的一段代码

我写的一段代码
回复

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2016-12-6 09:50:33 来自手机 | 显示全部楼层
嗯,你写的的这个方法不错呀,使用递归非常合适,不过在number==1时应该使用return
回复 支持 反对

使用道具 举报

1

主题

15

帖子

15

积分

贫民

积分
15
苍雪明南  楼主| 发表于 2016-12-6 20:59:48 | 显示全部楼层
blueelwang 发表于 2016-12-6 09:50
嗯,你写的的这个方法不错呀,使用递归非常合适,不过在number==1时应该使用return  ...

您能说得具体一点吗,这一块我不是太懂
回复 支持 反对

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2016-12-6 22:49:21 | 显示全部楼层
苍雪明南 发表于 2016-12-6 20:59
您能说得具体一点吗,这一块我不是太懂

递归的话一般会设置一个条件进行return, 当然你exit也没有问题,我只是说通用做法
回复 支持 反对

使用道具 举报

1

主题

15

帖子

15

积分

贫民

积分
15
苍雪明南  楼主| 发表于 2016-12-7 20:57:04 | 显示全部楼层
本帖最后由 苍雪明南 于 2016-12-7 21:02 编辑
blueelwang 发表于 2016-12-6 22:49
递归的话一般会设置一个条件进行return, 当然你exit也没有问题,我只是说通用做法 ...
您看这是我用return实现的
def collatz():
        global number
        if number==1:
                return number
        elif number%2==0:
                number=number//2
                print(number)
                collatz()
        else:
                number=3*number+1
                print(number)
                collatz()

        
print('Please enter a number what you want:')
while True:
        try:
                number=int(input())
                collatz()
                if number==1:
                        break
        except ValueError:
                print('You must enter a integer')
回复 支持 反对

使用道具 举报

1

主题

15

帖子

15

积分

贫民

积分
15
苍雪明南  楼主| 发表于 2016-12-7 20:58:14 | 显示全部楼层
本帖最后由 苍雪明南 于 2016-12-7 21:02 编辑
blueelwang 发表于 2016-12-6 22:49
递归的话一般会设置一个条件进行return, 当然你exit也没有问题,我只是说通用做法
回复 支持 反对

使用道具 举报

1

主题

15

帖子

15

积分

贫民

积分
15
苍雪明南  楼主| 发表于 2016-12-7 21:01:11 | 显示全部楼层
blueelwang 发表于 2016-12-6 22:49
递归的话一般会设置一个条件进行return, 当然你exit也没有问题,我只是说通用做法 ...

我想不用全局变量,直接调用函数返回值,但发现number值仍然是3,这里不太懂为什么还是3,要怎么改一下才能顺利让number值变为1然后跳出出循环呢?
  1. def collatz(number):
  2.         if number==1:
  3.                 return number
  4.         elif number%2==0:
  5.                 number=number//2
  6.                 print(number)
  7.                 collatz(number)
  8.         else:
  9.                 number=3*number+1
  10.                 print(number)
  11.                 collatz(number)

  12.         
  13. print('Please enter a number what you want:')
  14. while True:
  15.         try:
  16.                 number=int(input())
  17.                 collatz(number)
  18.                 print(number)
  19.                 if number==1:
  20.                         break
  21.         except ValueError:
  22.                 print('You must enter a integer')
复制代码
回复 支持 反对

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2016-12-7 22:52:07 | 显示全部楼层
你在循环里面并没有对number进行赋值操作呀, 即便你return了,也需要调用的地方进行接收返回值呀
回复 支持 反对

使用道具 举报

1

主题

15

帖子

15

积分

贫民

积分
15
苍雪明南  楼主| 发表于 2016-12-8 09:22:03 | 显示全部楼层
blueelwang 发表于 2016-12-7 22:52
你在循环里面并没有对number进行赋值操作呀, 即便你return了,也需要调用的地方进行接收返回值呀 ...

您看,我这样改一下之后发现函数的返回值是None,这是为什么呢?
返回值:
You must enter a integer
3
10
5
16
8
4
2
1
None

  1. def collatz(number):
  2.         #global number
  3.         if number==1:
  4.                 number=1
  5.                 return number
  6.         elif number%2==0:
  7.                 number=number//2
  8.                 print(number)
  9.                 collatz(number)
  10.         else:
  11.                 number=3*number+1
  12.                 print(number)
  13.                 collatz(number)

  14.         
  15. print('Please enter a number what you want:')
  16. while True:
  17.         try:
  18.                 number=int(input())
  19.                 number=collatz(number)
  20.                 print(number)
  21.                 if number==1:
  22.                         break
  23.         except ValueError:
  24.                 print('You must enter a integer')
复制代码
回复 支持 反对

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2016-12-8 22:22:55 | 显示全部楼层
苍雪明南 发表于 2016-12-8 09:22
您看,我这样改一下之后发现函数的返回值是None,这是为什么呢?
返回值:
You must enter a integer
  1. def collatz(number):
  2.     #global number
  3.     if number==1:
  4.         number=1
  5.         return number
  6.     elif number%2==0:
  7.         number=number//2
  8.         print(number)
  9.         return collatz(number)
  10.     else:
  11.         number=3*number+1
  12.         print(number)
  13.         return collatz(number)

  14.         
  15. print('Please enter a number what you want:')
  16. while True:
  17.     try:
  18.         number=int(input())
  19.         number=collatz(number)
  20.         print('Not in funtion. %d' % number)
  21.         if number==1:
  22.             break
  23.     except ValueError:
  24.         print('You must enter a integer')
复制代码


这样就可以啦,感觉你还是对递归不明白
其实那个return在每一个if分支里面都要有, 递归的过程你自己要想明白, 最好找一个简单的递归的例子练习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表