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
相关产品推荐
相关产品推荐

