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

Racket实现树的N深度节点查询时深度4报错求助

调试Racket树深度节点查询代码的错误

错误原因

你猜的没错,问题确实出在null的使用上。Racket里null是代表空列表的值(等同于'()),不是可调用的函数。你在代码里写了(null),这相当于把空列表当成过程来调用,必然会触发application: not a procedure错误。

当查询深度4时,程序会递归到叶子节点(比如D、E、G)的子节点(也就是()),此时进入(> n 1)分支,触发(and (null? (cadr tree)) (null? (caddr tree)))条件,执行(null),直接导致报错。

修复方案

第一步:修正null的写法

把所有(null)替换成null或者'(),这才是Racket中表示空列表的正确方式。修复基础错误后的代码如下:

#lang racket

(define (depth n tree)
  (cond [(= n 1) (car tree)]
        [(> n 1)
         (let ([left (cadr tree)]
               [right (caddr tree)])
           (cond [(and (null? left) (null? right)) null] ; 直接返回空列表,无需调用
                 [(null? left) (list (depth (- n 1) right))]
                 [(null? right) (list (depth (- n 1) left))]
                 [else (cons (depth (- n 1) left) (depth (- n 1) right))]))]))

第二步:简化分支逻辑(可选)

原代码的四个分支可以合并,通过过滤有效子节点来避免重复判断,让代码更简洁:

#lang racket

(define (depth n tree)
  (cond [(= n 1) (car tree)]
        [(> n 1)
         (let* ([children (list (cadr tree) (caddr tree))]
                [valid-children (filter (lambda (c) (not (null? c))) children)]
                [results (map (lambda (c) (depth (- n 1) c)) valid-children)])
           (cond [(null? results) null]
                 [(= (length results) 1) (list (car results))]
                 [else (cons (car results) (cadr results))]))]))

测试验证

用你的sampleTree测试修复后的代码:

(depth 4 sampleTree)

会返回'(G),这符合预期——因为你的树中深度4的节点只有G。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:35:23