Dr Racket 递归而不返回函数内的初始父节点

问题描述 投票:0回答:1

所以我有函数祖先名称,它从结构列表中获取参数 pers 并尝试返回该结构中出现的所有家庭成员的名称。初始结构如下所示。

struct human (name parent-1 parent-2)
(define (ancestors-names pers)
  (if (empty? pers)
      '()
      (cons (human-name pers)
            (append (ancestors-names (human-parent-1 pers))
                    (ancestors-names (human-parent-2 pers))))))

但是接下来我要递归地做同样的事情,而不使用初始的 per,或者换句话说,我应该返回一个名称的所有祖先的列表,而不在列表中包含该名字。我无法理解的是如何在不使用最初递归的初始节点或名称的情况下执行此操作。

(define (my-ancestors-names pers)
  (if (empty? pers)
      '()
      leaving out or altering -> (cons (human-name pers)
            (append (my-ancestors-names (human-parent-1 pers))
                    (my-ancestors-names (human-parent-2 pers))))))

我尝试使用 ( human-name( human-parent-1) int cons 语句,但是明显的问题是两棵树都是需要的,并且它只是返回一个空列表。

我尝试过只采用递归函数,而不使用 (cons (人名 pers) 只留下附加语句,但这不允许构建名称列表,并且只返回一个空白列表。老实说,我已经尝试了我所尝试的一切可以在心里真正弄清楚。询问堆栈交换是最后的手段,因为我与这里的人有过不好的互动,因为问“愚蠢”的问题而投反对票。老实说,这个地方一点也不受欢迎,因为没有理由曾经说过为什么这个问题很愚蠢。

scheme racket
1个回答
0
投票

首先,写下一个人的祖先是谁。
他们是

  • 两位父母,以及
  • 那些父母的祖先。

这很容易翻译成Scheme:

(define (ancestors-names pers)
  (if (empty? pers)
      '()
      (cons (human-parent-1 pers)
            (cons (human-parent-2 pers)
                  (append (ancestors-names (human-parent-1 pers))
                          (ancestors-names (human-parent-2 pers)))))))

或者,使用

let
-绑定,

(define (ancestors-names pers)
    (if (empty? pers)
            '()
        (let ([parent-1 (human-parent-1 pers)]
              [parent-2 (human-parent-2 pers)])
            (cons parent-1 (cons parent-2)
                  (append (ancestors-names parent-1)
                          (ancestors-names parent-2))))))
© www.soinside.com 2019 - 2024. All rights reserved.