所以我在学习球拍纯粹的结构递归(初学者)之后做了一些运动。 我无法得到适当的解决方案,
我必须这样做
写一个函数,list-evens消耗开始和结束,两个整数在哪里
start <=end
并生成一个从开始到结束的所有偶数整数的列表。对于
例如,(list-evens −4 3)
生成(list −4 −2 0 2)
所以这是我的代码
;;list-evens consumwes two integers and
;;produces a list of all even integers from start to end
;;list-evens: Int Int -> list-of-even-integers
;;requires: Start <= end
(define(list-evens start end)
(cond
[(= start end)(cons end empty)]
[else (cons start(list-evens(add1(add1 start))end))]))
(list-evens -4 2)-->Produces (cons -4 (cons -2 (cons 0 (cons 2 empty))))
但是当我更改(list-evens -4 3)
而不是(list-evens -4 2)
等测试的数字时,它会循环播放。永远不会停止。
同样(list-evens -4 2)
生成(cons -4 (cons -2 (cons 0 (cons 2 empty))))
它应生成(list-evens -4 -2 0 2)
答案 0 :(得分:0)
您的解决方案有几个问题:该函数应检查起始值是偶数还是奇数;它应该检查终止不是等于,但是大于或大于或等于那么(否则函数可以循环);递归是这样的,在某些情况下,它会在结果的末尾添加一个空列表。
这是一个可能的解决方案:
(define (list-evens start end)
(define (aux even-start)
(if (> even-start end)
empty
(cons even-start (aux (+ 2 even-start)))))
(aux (if (even? start) start (add1 start))))
该功能使用辅助功能在不均匀时改变起始值;当起始值大于结束值时,它终止,并且当开始大于开头的结尾时,它以正确的方式产生空列表。
答案 1 :(得分:0)
OPs功能可以修改如下:
(define(list-evens2 start end (ol '()))
(cond
[(> start end) ; output reversed list and end function
(reverse ol)]
[(even? start) ; add start to output list and recurse with start+2
(list-evens2 (+ 2 start) end (cons start ol))]
[else ; recurse with start+1 without adding to output list
(list-evens2 (+ 1 start) end ol)] ))
默认参数(ol '())
用于启动输出列表。
测试:
(list-evens2 -4 2)
(list-evens2 -4 3)
(list-evens2 -3 3)
(list-evens2 0 3)
(list-evens2 -3 0)
(list-evens2 -3 4)
输出:
'(-4 -2 0 2)
'(-4 -2 0 2)
'(-2 0 2)
'(0 2)
'(-2 0)
'(-2 0 2 4)
答案 2 :(得分:0)
(define (one first second)
(if (> first second) empty (cons first (one (+ 2 first) second)))
)
(define (list-evens start end)
(if (odd? start) (one (+ 1 start) end) (one start end))
)
这次我使用 cons
而不是 append
因为基本上我希望函数返回一个列表。
谢谢你指出我的错误!我查看了 Renzo 的解决方案以获得一些灵感。