坚持球拍结构递归运动?

时间:2016-10-25 19:01:39

标签: recursion racket

所以我在学习球拍纯粹的结构递归(初学者)之后做了一些运动。 我无法得到适当的解决方案,

我必须这样做 写一个函数,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)

3 个答案:

答案 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 因为基本上我希望函数返回一个列表。

  1. (list-evens 1 1) --> (一 2 1) --> '()
  2. (list-evens 2 2) --> (cons 2 (one 4 2)) --> (cons 2 '()) --> '(2)
  3. (list-evens -4 0) --> (cons -4 (one -2 2)) --> (cons -4 (cons -2 (one (0 2))) --> (cons - 4 (cons -2 (cons 0 (one 2 2)))) --> (cons -4 (cons -2 (cons 0 (cons 2 '())))) --> '(-4 -2 0 2)

谢谢你指出我的错误!我查看了 Renzo 的解决方案以获得一些灵感。