DrRacket递归问题:如何排除初始节点返回祖先姓名列表
解决方案
要实现仅返回所有祖先姓名(不包含自身)的my-ancestors-names函数,核心是移除原函数中添加自身姓名的逻辑,直接递归拼接双亲的祖先结果即可——因为递归处理双亲时,会自然包含双亲自己及其所有祖辈的姓名。
修改后的完整代码:
(define (my-ancestors-names pers) (if (empty? pers) '() (append (my-ancestors-names (human-parent-1 pers)) (my-ancestors-names (human-parent-2 pers)))))
逻辑说明
- 当输入人物为空(
empty? pers)时,返回空列表,作为递归终止条件。 - 不为空时,直接递归调用
my-ancestors-names处理父母双方,并用append合并两个结果:- 调用
(my-ancestors-names (human-parent-1 pers))会返回父方所有祖先(包括父亲自己)的姓名列表; - 同理,母方调用会返回母方所有祖先(包括母亲自己)的姓名列表;
- 合并后就是当前人物的全部祖先姓名,且不包含当前人物自身。
- 调用
为什么之前的尝试失败?
- 仅去掉
cons语句但没调整结构:原函数的cons是添加自身,去掉后直接返回双亲递归结果的拼接才是正确逻辑; - 仅取单双亲姓名:这样会丢失祖辈及更上层的祖先,必须通过递归遍历整个家族树的双亲分支才能覆盖所有祖先。
内容的提问来源于stack exchange,提问作者amadecember
相关产品推荐
相关产品推荐

