Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Racket 将两个递归组合成一个尾部递归代码_Racket_Tail Recursion - Fatal编程技术网

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

Racket 将两个递归组合成一个尾部递归代码,racket,tail-recursion,Racket,Tail Recursion,我试图定义使用列表的longestString函数(可能是 包含任何类型的元素)并返回最长的str 我构建了两个函数来实现这一点, 第一个接受任何类型的列表,并只输出字符串列表 第二个获取字符串列表并输出最长的字符串。 现在我面临的问题是如何将这两个函数组合在一起工作。 任何帮助都将不胜感激 第一个功能: ( : sublist-numbers : (Listof Any) -> (Listof String)) (define (sublist-numbers l ) ( :

我试图定义使用列表的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))))))))
输出应如下所示:

(测试(最长字符串’(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
总是返回
字符串