Racket 将两个递归组合成一个尾部递归代码
我试图定义使用列表的longestString函数(可能是 包含任何类型的元素)并返回最长的str 我构建了两个函数来实现这一点, 第一个接受任何类型的列表,并只输出字符串列表 第二个获取字符串列表并输出最长的字符串。 现在我面临的问题是如何将这两个函数组合在一起工作。 任何帮助都将不胜感激 第一个功能:Racket 将两个递归组合成一个尾部递归代码,racket,tail-recursion,Racket,Tail Recursion,我试图定义使用列表的longestString函数(可能是 包含任何类型的元素)并返回最长的str 我构建了两个函数来实现这一点, 第一个接受任何类型的列表,并只输出字符串列表 第二个获取字符串列表并输出最长的字符串。 现在我面临的问题是如何将这两个函数组合在一起工作。 任何帮助都将不胜感激 第一个功能: ( : sublist-numbers : (Listof Any) -> (Listof String)) (define (sublist-numbers l ) ( :
( : 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))))))))
输出应如下所示:
(测试(最长字符串’(34 uuu 90))=>错误)
(test(longestString’(uu 56 oooooo“r”“rRR”“TTT”)=>“rRR”)如果您的
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
和子列表编号组合在一起,并处理没有找到最大元素的情况:
(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"
(maxOf(子列表编号l))
?您在代码中多次执行相同的操作。例如(string?(first l))
。首先非常感谢,有一个我认为我不太理解,如果你能解释一下,我会很高兴,maxOf函数被定义为(:maxOf:(Listof string)->string),所以它必须返回一个字符串,我如何让它返回布尔值或字符串(就像你提供的固定代码一样)?我这样问是因为我得到了错误:类型检查器:预期类型不匹配:字符串给定:False in:#如果你是对的,我更新了我的答案,所以maxOf
总是返回字符串