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

编写tree-depth函数时遇错误,请求排查contract violation问题

问题分析与解决

错误原因

tree-node-left 是tree-node结构体的访问器函数,它要求参数必须是合法的tree-node实例,但运行时传入了'()(空列表),触发合约违反。

核心问题出在空树的判断逻辑:你的代码依赖empty-tree?识别空树,但该函数要么未正确定义,要么判断逻辑错误(比如没有把'()识别为空树)。当tree是'()时,empty-tree?返回#f,导致代码进入else分支,执行(tree-node-left tree)——此时tree是'(),自然不符合tree-node?的类型要求,触发错误。

另外一种可能是:你构造树时,叶子节点的左/右子树用'()表示,但递归过程中某个环节错误地将'()当作tree-node实例处理(本质还是empty-tree?的判断失效)。

解决办法

1. 正确定义empty-tree?函数

确保它能准确识别空树(即'()):

(define (empty-tree? tree)
  (null? tree))

2. 规范树的构造逻辑

所有树的构造必须符合约定:

  • 空树用'()表示
  • 非空树必须是tree-node结构体实例,且left、right字段只能是'()或另一个tree-node实例

3. 增强函数的健壮性(可选)

在tree-depth中增加类型检查,提前拦截非法输入,给出更明确的错误提示:

(struct tree-node (val left right) #:transparent)
(define (empty-tree? tree)
  (null? tree))
(define (tree-depth tree)
  (cond
    [(empty-tree? tree) 0]
    [(tree-node? tree)
     (+ 1 (max (tree-depth (tree-node-left tree))
               (tree-depth (tree-node-right tree))))]
    [else (error "tree-depth: invalid input, expected empty tree or tree-node, got " tree)]))

内容的提问来源于stack exchange,提问作者Gary Xiong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:27:49