我创建了几个函数来实现这个目标:
-
least_check 给出一个True/False 关于序列是否是“最小”的(例如'2 4' 将返回False,而'3 4' 将返回True)
-
find_leasts 这是递归函数,它将序列分解到问题所示树中的下一个级别(例如,'2 2 4 4' 将分解为 '2 4 4'、'2 3 4' 和 '2 2 4')直到它到达所有“最少”
-
main 从find_leasts 函数中创建所有“最少”yielded 的列表,并删除所有重复项(例如,示例序列有两次 '3')并返回唯一“最少”列表
答案:
def least_check(n):
check_list = [int(x) for x in n.split(' ')]
for a, b in zip(check_list[:-1], check_list[1:]):
if (a + b) % 2 == 0:
return False
return True
def find_leasts(n):
if len(n.split(' ')) == 1:
yield n
for i in range(len(n.split(' '))-1):
s = [int(x) for x in n.split(' ')]
if (s[i] + s[i+1]) % 2 == 0:
s[i] = int((s[i] + s[i+1]) / 2)
s.pop(i+1)
sub_n = ' '.join(str(j) for j in s)
if least_check(sub_n):
yield sub_n
else:
yield from find_leasts(sub_n)
def main(s):
all_leasts = [x for x in find_leasts(s)]
unique_leasts = list(set(all_leasts))
return unique_leasts
seq = '2 2 4 4'
print(sorted(main(seq), key=len))
结果:
['3', '2 3', '3 4', '2 3 4']
更新:
上述解决方案有很多split()s和' '.join()s,以避免递归函数修改列表引用(列表名称是指向其内存地址的指针-如果需要,请参阅this site以获得进一步解释) 从当前范围以外的深度。
当查看在'30 20 10 30 6 6' 序列上收到的错误并考虑到通过sys.setrecursionlimit 使用最大递归是not recommended 时,我重新评估了递归是否甚至是必要的——并确定它不是。
以下是迭代解决方案中使用的函数:
-
least_check - 与原始答案相同
-
break_down - 获取一个列表并将其分解为树中下一层的所有列表(例如,'2 2 4 4' 将分解为 '2 4 4'、'2 3 4' 和 '2 2 4')
-
least_lister - 遍历可能最少的列表队列,直到 least_lists 中的所有列表都是最少的
-
main - 执行所有 split() 和 ' '.join() 操作并在返回结果之前删除重复项
迭代解决方案:
def least_check(check_list):
for a, b in zip(check_list[:-1], check_list[1:]):
if (a + b) % 2 == 0:
return False
return True
def break_down(s, ret):
for i in range(len(s)-1):
if (s[i] + s[i+1]) % 2 == 0:
bd_list = s.copy()
bd_list[i] = int((bd_list[i] + bd_list[i+1]) / 2)
bd_list.pop(i+1)
ret.append(bd_list)
def least_lister(n):
least_lists = []
if least_check(n):
least_lists.append(n)
else:
i = 0
break_down(n, least_lists)
while i < len(least_lists):
if least_check(least_lists[i]):
i+=1
else:
break_down(least_lists[i], least_lists)
least_lists.pop(i)
return least_lists
def main(s):
s_list = [int(x) for x in s.split(' ')]
all_leasts = least_lister(s_list)
unique_leasts = list(set([' '.join(str(j) for j in i) for i in all_leasts]))
return unique_leasts
seq = '30 20 10 30 6 6'
print(sorted(main(seq), key=len))
迭代结果:
['18', '19', '19 6', '25 6', '25 10', '25 14', '30 13', '30 15', '30 17', '30 13 6', '30 17 6', '30 15 12', '30 15 18']
列表参考示例
def add_to_list(n):
n.append(len(n))
print(n)
a = [0, 1]
add_to_list(a)
print(a)
列表参考示例输出:
[0, 1, 2]
[0, 1, 2]