鱼C论坛

 找回密码
 立即注册
查看: 1501|回复: 7

[已解决]用递归方法判断是否是欧几里得数 的问题!

[复制链接]
发表于 2020-3-24 21:03:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. def gcd(x,y):
  2.     if x % y != 0:
  3.         times = 1
  4.         z = x % y
  5.         r = y % z
  6.         if r == 0:
  7.             print('%d 为 %d 与 %d 的最大公约数'%(z,x,y))
  8.         else:
  9.             return gcd(z,r)
  10.     else:
  11.         print('输入的整数不符合要求!')
复制代码

代码如上
  1. print('%d 为 %d 与 %d 的最大公约数'%(z,x,y))
复制代码

, 有什么办法能让这里的x,y  输出为第一次输入的参数x,y。

先谢谢咯~~
最佳答案
2020-3-25 13:34:46
可以使用闭包

  1. def gcd(x, y):
  2.     a = x
  3.     b = y

  4.     def f(x, y):
  5.         if x % y != 0:
  6.             times = 1
  7.             z = x % y
  8.             r = y % z
  9.             if r == 0:
  10.                 print('%d 为 %d 与 %d 的最大公约数' % (z, x, y))
  11.             else:
  12.                 return gcd(z, r)
  13.         else:
  14.             return y    # 修改

  15.     return f(x, y)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-24 21:24:40 | 显示全部楼层
运算之前,保存副本啊。
  1. def gcd(x,y):
  2.     a,b=x,y
  3.     if x % y != 0:
  4.         times = 1
  5.         z = x % y
  6.         r = y % z
  7.         if r == 0:
  8.             print('%d 为 %d 与 %d 的最大公约数'%(z,a,b))
  9.         else:
  10.             return gcd(z,r)
  11.     else:
  12.         print('输入的整数不符合要求!')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-24 21:48:25 | 显示全部楼层
sunrise085 发表于 2020-3-24 21:24
运算之前,保存副本啊。

我递归了  a,b 会被递归的值重新赋值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-24 21:54:43 | 显示全部楼层
本帖最后由 jackz007 于 2020-3-24 22:00 编辑

        把 gcd() 与数据输入、信息输出分离不就好了
  1. def gcd(x , y):
  2.     if y : return gcd(y , x % y)
  3.     else : return x

  4. s = input('请输入两个整数:') . strip() . split()
  5. r = gcd(int(s[0]) , int(s[1]))
  6. if r > 1 : print('%d 为 %d 与 %d 的最大公约数' % (r , int(s[0]) , int(s[1])))
  7. else : print('输入的整数不符合要求!')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-24 21:57:14 | 显示全部楼层
本帖最后由 sunrise085 于 2020-3-24 21:59 编辑
Twilight6 发表于 2020-3-24 21:48
我递归了  a,b 会被递归的值重新赋值


不好意思,没看到你使用了递归,那样的话,你就不能再函数中这样print了。
因为一旦执行到if语句,一般都会进行了若干次递归了,那时的gcd(x,y)中的x和y早就不是原来的x和y 了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-24 22:02:10 | 显示全部楼层
jackz007 发表于 2020-3-24 21:54
把 gcd() 与数据输入、信息输出分离不就好了

哈哈  我现在的知识感觉有点限制了我的理解。。。看不懂尴尬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-24 22:02:57 | 显示全部楼层
sunrise085 发表于 2020-3-24 21:57
不好意思,没看到你使用了递归,那样的话,你就不能再函数中这样print了。
因为一旦执行到if语句,一 ...

好吧。。。不过还是谢谢啦~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-25 13:34:46 | 显示全部楼层    本楼为最佳答案   
可以使用闭包

  1. def gcd(x, y):
  2.     a = x
  3.     b = y

  4.     def f(x, y):
  5.         if x % y != 0:
  6.             times = 1
  7.             z = x % y
  8.             r = y % z
  9.             if r == 0:
  10.                 print('%d 为 %d 与 %d 的最大公约数' % (z, x, y))
  11.             else:
  12.                 return gcd(z, r)
  13.         else:
  14.             return y    # 修改

  15.     return f(x, y)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 03:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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