如何设计Racket函数获取列表最后一个正值(无正值返回'negative)
Racket自定义函数实现
需求说明
实现一个接收列表作为参数的函数:
- 返回列表中最后一个大于0的正数值
- 如果列表中不存在任何正数值,返回
'negative - 实现时仅可使用指定的列表操作函数/值:
cons、first、second、rest、empty、empty?、length、append、list、list-ref、make-list,基础语法、数值比较运算属于语言核心能力,不在限制范围内。
实现思路
采用线性递归从前向后遍历列表,用一个单元素列表存储遍历过程中遇到的最新正数:
- 初始状态下未找到任何正数,存储值为空列表
- 每遍历到一个元素,如果是正数就更新存储值为仅包含该正数的单元素列表;如果不是正数则保留原有存储值
- 遍历完整个列表后,如果存储值为空说明没有找到正数,返回
'negative;否则返回存储列表里的元素即可 - 整个实现仅用到允许列表内的
cons/first/rest/empty/empty?,没有使用范围外的列表处理函数。
完整代码
(define (last-positive lst) ; 内部递归迭代器:remain为待遍历的剩余列表,last-found为存储已找到最后一个正数的单元素列表 (define (iter remain last-found) (if (empty? remain) ; 遍历结束,判断是否找到过正数 (if (empty? last-found) 'negative (first last-found)) (iter (rest remain) ; 当前元素是正数则更新存储值,否则保留原值 (if (> (first remain) 0) (cons (first remain) empty) last-found)))) ; 初始调用:待遍历列表为输入全量列表,初始存储值为空 (iter lst empty))
测试验证
- 输入
(last-positive (list 1 -2 3 -4)),返回3(列表最后一个正数为3) - 输入
(last-positive (list -1 -2 -3)),返回'negative(无正数) - 输入
(last-positive empty),返回'negative(空列表无元素) - 输入
(last-positive (list -5 0 2 -3 7 -8)),返回7(最后一个正数为7) - 输入
(last-positive (list 9)),返回9(单个正数元素)
内容的提问来源于stack exchange,提问作者Shah
相关产品推荐
相关产品推荐

