📅  最后修改于: 2023-12-03 15:12:41.641000             🧑  作者: Mango
这是一道涉及递归的编程问题,GATE-CS-2006中的问题26。
设计一个函数,接收一个整数n作为输入参数,将1到n个整数依次输出,其中如果数字是克隆数字或是克隆数字的倍数,则替换为“CLOSE”。
克隆数字定义为在一个数字的十进制表示中,任意两个数字都可以通过重排而互相得到。例如,1123、1312、2113等均为克隆数字。
n:一个整数,1 ≤ n ≤ 10^9。
输出1到n中的整数,如果某个整数是克隆数字或是克隆数字的倍数,则输出“CLOSE”。
输入:
6
输出:
1 2 CLOSE 4 CLOSE CLOSE
这道题看起来非常简单,只需要依次输出1到n,并判断克隆数字即可。
但问题在于“克隆数字的倍数”,这就需要用到递归了。我们可以先用一个函数isClone(num)
来判断数字num
是否是克隆数字。然后再定义一个递归函数outputNumbers(n, i)
来输出1到n中的所有整数,并以i作为当前输出的数字。在输出i时,判断isClone(i)
是否为真。如果为真,输出“CLOSE”。否则,判断i是否是克隆数字的倍数,如果是,则递归调用outputNumbers(n, i+1)
;否则,直接输出i+1。
具体实现见以下代码:
def isClone(num):
s1 = str(num)
s2 = ''.join(sorted(s1))
return s1 == s2
def outputNumbers(n, i):
if i > n:
return
if isClone(i) or i % int(''.join(sorted(str(i)))) == 0:
print("CLOSE", end=' ')
outputNumbers(n, i+1)
else:
print(i, end=' ')
outputNumbers(n, i+1)
n = int(input())
outputNumbers(n, 1)
使用递归的代码要注意递归深度的问题,如果n很大,递归可能会深到爆栈。但由于python中的递归深度非常大,这里并不会出现这个问题。