有一个名为“Pedigree: Ancestors and Descendants”的pythontutor作业。
条件:
给定树中的两个元素。确定其中一个是否是另一个的孩子。
输入数据包含一棵与上一个问题中格式相同的树接下来是请求数 K。接下来的 K 行中的每一行都包含树的两个元素的名称。
对于每个这样的查询,打印三个数字之一:如果第一个元素是第二个元素的祖先,则打印 1,如果第二个元素是第一个元素的祖先,则打印 2,或者如果它们都不是另一个元素的祖先,则打印 0。
它是介绍性的(src_data.txt):
9
Alexei Peter_I
Anna Peter_I
Elizabeth Peter_I
Peter_II Alexei
Peter_III Anna
Paul_I Peter_III
Alexander_I Paul_I
Nicholaus_I Paul_I
3
Anna Nicholaus_I
Peter_II Peter_I
Alexei Paul_I
有一个代码(嗯,就是一个解决方案的尝试):
def input():
return rows.pop(0)
rows = []
file = open('src_data.txt', 'r')
for line in file:
rows.append(line[:-1])
# ======== Досюда это имитация ввода на PythonTutor ===
names = set()
tree = []
for _ in range(int(input()), 1, -1):
child, parrent = input().split()
tree.append([child, parrent])
names.update([child, parrent])
for name in names:
for item in tree:
if name == item[0]:
for i in range(len(tree)):
if name == tree[i][-1]:
tree[i].append(item[1])
# === Собственно проблема вот этом блоке (который выше) ==
# === Он то формирует списки как нужно, то недовставляет элементы ==
res_row = []
for _ in range(int(input())):
pers_1, pers_2 = input().split()
res = '0'
for branch in tree:
if pers_1 in branch and pers_2 in branch:
if branch.index(pers_1) > branch.index(pers_2):
res = '1'
else:
res = '2'
res_row.append(res)
print(' '.join(res_row))
如果不是输出中的随机值,一切都会好起来的:
for i in {1..40}; do python3 first.py; sleep 1; done
0 2 0
0 2 0
0 2 0
1 2 0
0 2 0
1 2 0
1 2 0
0 2 0
1 2 0
1 2 0
1 2 0
1 2 0
1 2 0
0 2 0
请解释这是怎么回事,有什么问题?
其实想通了。我注意到本身有问题的块是一条曲线,结果的随机性是由于该块中涉及的集合没有按定义排序,并且元素每次分别排列不同,据我了解,循环不会达到所有值,并且输出取决于元素所在的集合中的位置。所以我完成了它(我自己没有看开发人员):-))。
不要忘记在 file=open(***) 之后执行 file.close() 顺便说一句,您需要在此任务中使用递归。我自己也尝试在 pythontutor 上解决这个问题很长时间,我提出了一个非常漫长而可怕的解决方案(当然没有任何递归)))并且它适用于 pythontutor 的所有变体,然后我想出了 pythontutor 提供的解决方案我)对我来说是一项艰巨的任务。