鱼C论坛

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

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

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

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

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

x
def gcd(x,y):
    if x % y != 0:
        times = 1
        z = x % y
        r = y % z
        if r == 0:
            print('%d 为 %d 与 %d 的最大公约数'%(z,x,y))
        else:
            return gcd(z,r)
    else:
        print('输入的整数不符合要求!')
代码如上
print('%d 为 %d 与 %d 的最大公约数'%(z,x,y))
, 有什么办法能让这里的x,y  输出为第一次输入的参数x,y。

先谢谢咯~~
最佳答案
2020-3-25 13:34:46
可以使用闭包
def gcd(x, y):
    a = x
    b = y

    def f(x, y):
        if x % y != 0:
            times = 1
            z = x % y
            r = y % z
            if r == 0:
                print('%d 为 %d 与 %d 的最大公约数' % (z, x, y))
            else:
                return gcd(z, r)
        else:
            return y    # 修改

    return f(x, y)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-24 21:24:40 | 显示全部楼层
运算之前,保存副本啊。
def gcd(x,y):
    a,b=x,y
    if x % y != 0:
        times = 1
        z = x % y
        r = y % z
        if r == 0:
            print('%d 为 %d 与 %d 的最大公约数'%(z,a,b))
        else:
            return gcd(z,r)
    else:
        print('输入的整数不符合要求!')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我递归了  a,b 会被递归的值重新赋值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

s = input('请输入两个整数:') . strip() . split()
r = gcd(int(s[0]) , int(s[1]))
if r > 1 : print('%d 为 %d 与 %d 的最大公约数' % (r , int(s[0]) , int(s[1])))
else : print('输入的整数不符合要求!') 
想知道小甲鱼最近在做啥?请访问 -> 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 了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哈哈  我现在的知识感觉有点限制了我的理解。。。看不懂尴尬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好吧。。。不过还是谢谢啦~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-25 13:34:46 | 显示全部楼层    本楼为最佳答案   
可以使用闭包
def gcd(x, y):
    a = x
    b = y

    def f(x, y):
        if x % y != 0:
            times = 1
            z = x % y
            r = y % z
            if r == 0:
                print('%d 为 %d 与 %d 的最大公约数' % (z, x, y))
            else:
                return gcd(z, r)
        else:
            return y    # 修改

    return f(x, y)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 09:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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