Я изучаю Scheme в классе, и мой профессор не отвечает на вопросы после 8:00, поэтому я надеюсь, что вы все сможете мне помочь.По сути, у меня есть тип семейного древа, и я пытаюсь собрать всех предков одного человека и отобразить их в виде одной строки, отсортированной по алфавиту.
Проблема в том, что из-за рекурсии каждое поколение объединяется в свою собственную строку, поэтому вместо того, чтобы получать "человек", "человек б", я получаю "человек человек б".Поэтому, когда я собираюсь отсортировать их, прежде чем добавить их все к одной строке, он сортирует только первое имя в паре, что означает, что второе имя не сортируется.Я не совсем уверен, как это объяснить сам.Я надеюсь, что код объяснит большую часть этого для меня.
(define-struct person
(
first ; a string: first name
last ; a string: last name
sex ; a symbol: 'male, 'female
eyes ; a symbol: 'blue, 'brown', 'green
hair ; a symbol: 'blonde, 'brown, 'black, 'red
mother; a person: empty if not known
father; a person: empty if not known
born ; a number: year of birth
)
)
(define P-00000 (make-person "Alexandra" "Harper" 'female 'blue 'red empty empty 1897))
(define P-10000 (make-person "Joshua" "Sherman" 'male 'green 'blonde empty empty 1881))
(define P-20000 (make-person "Alexandra" "Hazel" 'female 'brown 'red empty empty 1906))
(define P-30000 (make-person "Christopher" "Abdul" 'male 'brown 'brown empty empty 1904))
(define P-01000 (make-person "Lauren" "Sherman" 'female 'green 'black P-00000 P-10000 1914))
(define P-21000 (make-person "Alexander" "Abdul" 'male 'blue 'brown P-20000 P-30000 1927))
(define P-01100 (make-person "Justine" "Abdul" 'female 'blue 'black P-01000 P-21000 1949))
(define (strlist-to-str StrLst Sep)
(cond
[(empty? StrLst) ""]
[(equal? (first StrLst) "") (strlist-to-str (rest StrLst) Sep)]
[(empty? (rest StrLst)) (first StrLst)]
[else (string-append (first StrLst) Sep (strlist-to-str (rest StrLst) Sep))]
)
)
(define (person-to-lfn ; string
who ; person
)
(cond
[(string? who) who]
[else (string-append (person-last who) "," (person-first who))]
)
)
(define (ancestors ; string
who ; person
)
(cond
[(empty? (person-mother who)) ""]
[else
(strlist-to-str (sort (list (person-to-lfn (person-mother who))
(person-to-lfn (person-father who))
(ancestors (person-mother who))
(ancestors (person-father who))) string<?) " ")]
)
)
(check-expect (ancestors P-01100) "Abdul,Alexander Abdul,Christopher Harper,Alexandra Hazel,Alexandra Sherman,Joshua Sherman,Lauren")
Проверьте ошибки:
Actual value "Abdul,Alexander Abdul,Christopher Hazel,Alexandra Harper,Alexandra Sherman,Joshua Sherman,Lauren" differs from "Abdul,Alexander Abdul,Christopher Harper,Alexandra Hazel,Alexandra Sherman,Joshua Sherman,Lauren", the expected value.
at line 64, column 0 <code>