将两个递归合并为一个尾递归代码
Combine two recursions into one tail-recursion code
我正在尝试定义使用列表的 longestString 函数(可能
包含任何类型的元素)和 returns 最长的 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))))))))
输出应该是这样的:
(测试 (longestString '(34 uuu 90)) => false)
(test (longestString '(uu 56 oooo "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
和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"
我正在尝试定义使用列表的 longestString 函数(可能 包含任何类型的元素)和 returns 最长的 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))))))))
输出应该是这样的:
(测试 (longestString '(34 uuu 90)) => false) (test (longestString '(uu 56 oooo "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
和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"