将两个递归组合成一个尾递归代码

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

我正在尝试定义使用列表的函数longestString(可能包含任何类型的元素)并返回最长的str

我已经构建了两个函数来执行此操作,第一个函数采用任何类型的列表并输出仅一个字符串的列表,第二个采用字符串列表并输出最长的字符串。现在我遇到的问题是如何将这两个功能结合起来。任何帮助,将不胜感激

第一个功能:

( : 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”)

racket tail-recursion
1个回答
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实现起来很简单:你只需要组合maxOfsublist-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"
© www.soinside.com 2019 - 2024. All rights reserved.