繁体   English   中英

使用递归为球拍获得第N个位置

[英]Using recursion to getNth position for Racket

我必须在Racket中编写一个递归调用,使我们能够获得给定列表的第N个位置。 例如(getNth 3'(1 2 3 4))应该返回4,如果列表为空或位置不存在,则返回为空列表。

这是我的代码:

(define getNth
   (lambda (ls)
     (if (= ls null?) 1
         (getNth ls(append '(car ls)(cdr ls)))))) 

得到这个错误:getnth:arity不匹配; 预期的参数数量与预期的给定数量不匹配:1个给定的:2个参数...:4()

如果您需要递归语句,则为:

如果LS = null,则返回基数-getNth N LS)=()

如果N> = 1,则递归调用-(getNth N LS)=(getNth N(追加'(car LS)(cdr LS)))

即时通讯陷入困境,我不知道如何实现这一目标。

假设您的getNth可以从列表中取消“ N”(而不是固定的N即get3rd),则您确实缺少一个参数:

(define getNth                     
   (lambda (n list)                   
      (cond ((null? list) '())             
            ((= n 0) (car list))              
            (else (getNth (- n 1) (cdr list))))))

这基本上是直到我得到想要的数字,然后递减它并“弹出”第一个元素,直到列表的第一个元素是我想要的那个元素,即列表的其余部分。

您的lambda仅采用您定义它的方式的一个参数,而这正是您收到的错误消息;)

我想我适当地平衡了括号:)

递归技巧:它的通用概念很简单:

重新提醒是“如果发生了终止条件,我就完成了,返回适当的值。否则,将参数增加到终止条件并用​​这些新参数调用自己”

当终止条件可以有异常时,它将变得很复杂。 因为如果您不能简单地将其表示为“如果执行此操作,否则将以增量重做”,则可能会出错...

您的代码有几个问题。

  1. 您说您需要一个接受两个参数的过程,但您的过程仅接受ls
  2. ls为空列表时,结果为1
  3. 如果list不为空,则递归使用两个参数,即两个列表。 第一个与进行无限递归的原始参数相同。 第二个是'(car lst)之间'(car lst) ,该值的值是列表(car lst)(cdr ls) (列表ls除第一对外)
(define get-nth
  (lambda (index lst)
    (if (= index 0)            ; when index is zero
        (car lst)              ; return the first element
        (get-nth (- index 1)   ; else recurse with the decrement of index
                 (cdr lst))))) ; and all but the first element (the rest) of lst

;; test
(get-nth 0 '(a))   ; ==> a
(get-nth 1 '(a b)) ; ==> b

;; However, this won't work:
(get-nth 0 '())       ; will fail
(get-nth 10 '(a b c)) ; will fail

我有点喜欢这样的事实,即如果输入错误的参数,它将无法正常工作。 如果给了错误的参数, list-refcar也会失败,但这很容易解决:

(define get-nth
  (lambda (index lst)
    (cond ((not (pair? lst)) '())        ; it should always be a pair
          ((= index 0) (car lst))        ; when index is zero, return the first element
          (else (get-nth (- index 1)     ; else recurse with the decrement of index
                         (cdr lst))))))  ; and all but the first element (the rest) of lst

您不仅可以使用默认值,还可以使用(raise'get (raise 'get-nth-error) (R6RS +)而不是默认值来抛出空列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM