You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅用逻辑运算符实现Racket中的cond?作业递归函数改写求助

解决思路与正确实现

你的核心需求是利用Racket逻辑运算符的短路求值特性,模拟cond的分支逻辑,同时避免使用if/cond这类条件语句。先拆解原函数的逻辑:

  1. 若偏好列表为空,返回#t
  2. 若列表首元素是x,返回#t
  3. 若列表首元素是y,返回#f
  4. 否则递归处理剩余列表

你的尝试错误在于:遇到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:00:10