Racket [v8.6 Beginning Student]函数简化求助:q3a/q3b/q3c优化
Racket函数简化优化方案
核心依据梳理
先明确给定约束:
- q3b、q3c仅输出
up/down,所有输出left/right的分支均为不可达分支,可直接删除 - 已确认的等价输出规则:
(q3a #t #f) = (q3b #t #f)→ q3b该分支输出up(q3b #t #t) = (q3c #t #t)→ q3b该分支输出up(q3c此处输出up)(q3a #f #t) = (q3b #f #t)→ q3b该分支输出down
逐个函数简化
1. q3c 简化
原嵌套cond可直接转换为逻辑表达式,适配Beginning Student环境:
; 原代码 (define (q3c p1? p2?) (cond [(cond [p1? p2?] [else true]) 'up] [else 'down])) ; 简化后(扁平结构+清晰逻辑) (define (q3c p1? p2?) (cond [(or (not p1?) p2?) 'up] ; 等价于原嵌套cond的判断逻辑 [else 'down]))
逻辑说明:当p1?为假,或p1?为真且p2?为真时输出up,否则输出down。
2. q3b 简化
基于约束剔除无效分支并推导逻辑:
(and p1? false)永远为假,直接删除该分支- 所有输出
left/right的分支均不可达,直接删除 - 结合等价规则推导:
p1?为真时无论p2?取值,均输出up;p1?为假时无论p2?取值,均输出down
简化后代码:
; 原代码(冗余分支较多) (define (q3b p1? p2?) (cond [p1? (cond [p2? (cond [p1? 'up] [p2? 'down] [else 'right])] [else (cond [p2? 'down] [else 'up])])] [(and p1? false) (cond [p2? 'left] [else 'right])] [else 'down])) ; 简化后 (define (q3b p1? p2?) (if p1? 'up 'down))
验证:完全符合所有给定等价输出条件,且仅输出up/down。
3. q3a 简化
q3a原逻辑包含left/right输出,若仅优化结构(不修改输出),可将嵌套cond展开为扁平结构提升可读性:
; 原代码 (define (q3a p1? p2?) (cond [p2? (cond [p1? 'left] [else 'down])] [else (cond [p1? 'up] [else 'right])])) ; 简化后(扁平cond结构) (define (q3a p1? p2?) (cond [(and p2? p1?) 'left] [(and p2? (not p1?)) 'down] [(and (not p2?) p1?) 'up] [else 'right]))
若需让q3a也仅输出up/down,需补充(q3a #t #t)和(q3a #f #f)的输出规则(当前给定条件未覆盖这两个场景)。
内容的提问来源于stack exchange,提问作者agcny
相关产品推荐
相关产品推荐

