Python判断域D1上关系r传递性代码输出异常问题排查
问题分析
你的代码存在两个核心逻辑错误:
- 冗余的第四层循环:代码中不需要遍历变量d,这层无意义的循环会让同一个符合判定条件的三元组重复打印11次(D1共包含11个元素),是输出大量重复内容的直接原因。
- 传递性判定规则写错:关系的传递性定义为:对任意a、b、c∈D1,若
r(a,b)和r(b,c)同时成立,则r(a,c)必须成立。只要存在任意一组a、b、c满足前两个条件但不满足第三个,就可以判定关系不具有传递性。你代码中的判定条件r(a,b) and b == c和传递性的定义完全无关,因此会输出错误的反例三元组。
修正后的代码
D1 = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21} def r(x, y): R = [[9, 7], [9, 5], [9, 3], [9, 1], [7, 5], [7, 3], [7, 1], [5, 3], [3, 1]] return [x, y] in R rIsTransitive = True # 仅需要三层循环遍历a,b,c三个变量即可 for a in D1: if not rIsTransitive: break for b in D1: if not rIsTransitive: break for c in D1: # 符合传递性不成立的判定条件:r(a,b)和r(b,c)成立,但r(a,c)不成立 if r(a,b) and r(b,c) and not r(a,c): rIsTransitive = False print(f'The triple ({a},{b},{c}) shows that r is not transitive') break if rIsTransitive: print('The relation r on domain D1 is transitive.') else: print('The relation r on domain D1 is not transitive.') print(' ')
运行结果
和你预期的输出完全一致:
The triple (5,3,1) shows that r is not transitive The relation r on domain D1 is not transitive.
内容的提问来源于stack exchange,提问作者aflo7
相关产品推荐
相关产品推荐

