递归问题常常作为中等难度题目进行考查,经过博主对递归的研究,递归可大致分为“字符串”递归和“地图查找”递归,两种递归解决办法大同小异,原理都是深度优先算法。
题目描述
有一个考古学家发现一个石碑,但是很可惜,发现时已经短成多段,原地发现n个断口整齐的石碑碎片。为了破解石碑内容,考古学家希望有程序可以帮助复原石碑文字的组合数,你能帮忙吗?
输入
第一行输入n,n表示石碑碎片的个数
第二行依次输入石碑碎片上的文字内容,共有n组
输出
输出石碑文字的组合(升序),行末无多余空格
示例1
输入
3
a b c
输出
abc
acb
bac
bca
cab
cba
说明
按照深度优先依次查找即可
示例2
输入
3
a a b
输出
aab
aba
baa
说明
利用元组去重,并对去重后的列表进行排序
解题思路及代码
递归问题解题步骤:
1.确认终止条件。该条件是指不再往下寻找的条件,“字符串”递归问题的终止条件为当前字符串长度为0
2.确认每一步需要处理的参数及与最终输出结果相关的对象
3.宏观观察函数需要return 布尔值 or 数值 or 0,实际根据题目要求来定
代码如下(示例):
n = int(input())
alpha = input().split()
res = []
loc = ''
def combine(x, y):
global res
if len(x) == 0: # 停止条件
res.append(y) # 输出结果
return 0
else:
l_x = len(x)
for i in range(l_x): # 常见深度优先算法
a = x[i] # 当前数
b = x[:i] + x[i + 1:] # 剩下的放入下次循环中
combine(b, y + a) # 为不影响其他组合,变量计算需要在函数中进行
return
combine(alpha, loc)
res_new = sorted(list(set(res)))
for j in res_new:
print(j)
总结
递归程序量不大但很灵活,需要综合考虑输入、输出。