用球拍初学者语言写一个递归函数时被困住了?

时间:2016-10-25 05:21:23

标签: recursion racket racket-student-languages

所以最近我学习了递归函数,我正在尝试一些运动,然后我就陷入了困境。

问题是 list-nth-item,消耗列表,(lst)和自然数,(n)和 如果存在,则在lst中生成第n个元素,否则该函数产生false。注意 第一项是在索引0中。例如:(list-nth-item (list 1 2 3) 0)生成1

这是我的代码

     ;;list-nth-item consumes list and a natural number
     ;;and produces the n-th element in the list or false
     ;;list-nth-item: List Nat -> (Anyof Any false)
    (define (list-nth-item lst n)
          (cond
            [(empty? lst)false]
            [(= n 0)(first lst)]
            [else ????]))


         (list-nth-item (list 1 2 3)2)--> should produce 3

我知道这不是一个正确的递归,当n = 0时它应该在列表示例中产生第一个数字(list-nth-item (list 1 2 3)0)应该给1。 我是新手,只是没有得到如何形成递归。

1 个答案:

答案 0 :(得分:1)

将列表视为传送带:您检查是否到达了您的项目(使用您的第一个案例(= n 0)),如果没有(else案例),您只需转移皮带即可列表尾部(使用cdr函数)并再次重复该过程。

可以这样做:

(define (list-nth-item lst n)
  (cond
    [(empty? lst) #f]
    [(zero? n) (car lst)]
    [else (list-nth-item     ; <-- repeats the process
           (cdr lst)         ; <-- shifts the "belt"
           (sub1 n))]))      ; <-- updates the number of steps to go

PS:这已由list-ref函数完成。