#racket #tail-recursion
#racket #хвостовая рекурсия
Вопрос:
Я пытаюсь определить функцию longestString, которая использует список (может содержать элементы любого типа) и возвращает самый длинный str
Для этого у меня есть функция build two, первая принимает список любого типа и выводит список только строк, вторая принимает список строк и выводит самую длинную строку. Теперь проблема, с которой я столкнулся, заключается в том, как объединить эти две функции для совместной работы. Любая помощь была бы оценена
первая функция:
( : sublist-numbers : (Listof Any) -> (Listof String))
(define (sublist-numbers l )
( : sublist-numbers-helper : (Listof Any) (Listof String)-> (Listof String))
(define (sublist-numbers-helper l r)
(cond ((null? l) r)
((string? (first l)) (sublist-numbers-helper (rest l) (cons (first l) r )))
(else (sublist-numbers-helper (rest l) r))))
(sublist-numbers-helper l '()))
second function:
( : maxOf : (Listof String) -> String)
(define (maxOf l)
(cond
;((null? list) (error "empty list") )
((null? (rest l)) (first l))
(else (cond
((> (string-length(first l)) (string-length(maxOf (rest l)))) (first l))
(else (maxOf (rest l))))))))
Результат должен быть примерно таким:
(test (longestString ‘(34 uuu 90)) => false) (test (longestString ‘(uu 56 oooo «r» «rRR» «TTT»)) => «rRR»)
Комментарии:
1.
(maxOf (sublist-numbers l))
? Вы делаете то же самое много раз в своем коде. Например(string? (first l))
.
Ответ №1:
В вашей maxOf
процедуре обнаружена ошибка, также необходимо учитывать случай с пустым списком:
(define (maxOf l)
(cond ((null? l) "") ; a string type is required
((null? (rest l))
(first l))
((> (string-length (first l)) (string-length (maxOf (rest l))))
(first l))
(else (maxOf (rest l)))))
После исправления этого longestString
реализовать тривиально: вам просто нужно составить вместе maxOf
и sublist-numbers
и обработать случай, когда не было найдено ни одного максимального элемента:
(define (longestString l)
(let ((result (maxOf (sublist-numbers l))))
(if (string=? result "")
false
result)))
Это работает так, как ожидалось:
(longestString '(34 uuu 90))
=> #f
(longestString '(uu 56 oooo "r" "rRR" "TTT"))
=> "rRR"
Комментарии:
1. Во-первых, большое спасибо, есть одна вещь, которую я, кажется, не совсем понимаю, и был бы рад, если бы вы могли объяснить, функция maxOf определяется как ( : maxOf : (Listof String) -> String), поэтому она должна возвращать строку, как я могу заставить ее возвращать либо логическое значение, либо строку (как в предоставленном вами фиксированном коде)? Я спрашиваю, потому что получаю ошибку: Проверка типа: ожидаемое несоответствие типа: Задана строка: False в: #f
2. Вы правы, я обновил свой ответ, поэтому
maxOf
всегда возвращаетstring