python实现:指定的两个数经过某种变换规则,是否可以变为同一个数(Cloudin云英笔试编程题)

目录

问题

解题思路

python具体实现

题外话


问题

    对于一个数字x,给出两个变换规则:

    1)若x为偶数,那么可以变成x+1或者2*x;

    2)若x为奇数时,则只可以变换为2*x问题。

因此,对于任意的x,y。问x经过若干轮变换后,是否有可能变成y?


解题思路

    分析:考虑用何种方法实现,可以发现,每一步变换后,和之前的变换是类似的,因此,采用递归来实现,是再合适不过了。

    此题采用递归的实现,逻辑和步骤和题干基本一致。具体参见代码:

注意:flag变量需要设置为全局变量。


python具体实现

方式一:设置全局变量实现

flag = False # 标记
def checkXToY(x,y):
    global flag         # 全局变量声明
    if x>y:
        return 0
    if x==y:
        flag = True 
        
    temp = x%2          # 奇数、偶数判断
    if temp == 1:
        checkXToY(2*x,y) # 递归实现
    else:
        checkXToY(x+1,y)
        checkXToY(2*x,y)


# 测试   
checkXToY(4,16)
print(flag)

方式二:函数通过返回值实现,具体如下,可和上例实现进行对比分析:

def checkXToY(x,y):
    # global flag         # 全局变量声明
    if x>y:
        return False
    if x==y:
        return True 
        
    temp = x%2          # 奇数、偶数判断
    if temp == 1:
        return checkXToY(2*x,y) # 递归实现
    else:
         return  checkXToY(x+1,y) or checkXToY(2*x,y)


# 测试   
flag = checkXToY(3,16)
print(flag)

题外话

      这个题,一种方式需要设定全局变量来控制实现,我这一团浆糊的脑袋,想了半天才想明白,返回值只是返回被调用的函数的值,并不会退调用的函数。因此,不设置全局变量的实现,就是方式二。

    疑惑需要思维的碰撞,感谢碰撞!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步,慕至千里

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值