目录
问题
对于一个数字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)
题外话
这个题,一种方式需要设定全局变量来控制实现,我这一团浆糊的脑袋,想了半天才想明白,返回值只是返回被调用的函数的值,并不会退调用的函数。因此,不设置全局变量的实现,就是方式二。
疑惑需要思维的碰撞,感谢碰撞!!!