Объедините две рекурсии в один код хвостовой рекурсии

#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