如何仅用逻辑运算符实现Racket中的cond?作业递归函数改写求助
解决思路与正确实现
你的核心需求是利用Racket逻辑运算符的短路求值特性,模拟cond的分支逻辑,同时避免使用if/cond这类条件语句。先拆解原函数的逻辑:
- 若偏好列表为空,返回
#t - 若列表首元素是
x,返回#t - 若列表首元素是
y,返回#f - 否则递归处理剩余列表
你的尝试错误在于:遇到y时反而继续递归,违背了原逻辑中“遇到y直接返回#f”的规则。以下是正确的实现:
(define (is-preferred? pref-list x y) (or (null? pref-list) (equal? (car pref-list) x) (and (not (equal? (car pref-list) y)) (is-preferred? (cdr pref-list) x y))))
逻辑解释
(null? pref-list):空列表直接返回#t,触发or的短路,后续条件不执行(equal? (car pref-list) x):首元素是x时返回#t,同样触发短路- 若前两个条件都不成立,则进入
and分支:- 先检查
(not (equal? (car pref-list) y)):如果首元素是y,此条件为#f,整个and返回#f,正好匹配原逻辑中遇到y返回#f的规则 - 如果首元素既不是
x也不是y,则递归处理剩余列表
- 先检查
这种写法完全依赖or/and的短路特性,完美复刻了原cond的分支逻辑,且没有使用任何条件语句。
内容的提问来源于stack exchange,提问作者Maria Chirnogeanu
相关产品推荐
相关产品推荐

