📜  门| GATE-CS-2006 |问题 26(1)

📅  最后修改于: 2023-12-03 15:12:41.641000             🧑  作者: Mango

门 | GATE-CS-2006 |问题 26

这是一道涉及递归的编程问题,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中的递归深度非常大,这里并不会出现这个问题。