[英]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仅采用您定义它的方式的一个参数,而这正是您收到的错误消息;)
我想我适当地平衡了括号:)
递归技巧:它的通用概念很简单:
重新提醒是“如果发生了终止条件,我就完成了,返回适当的值。否则,将参数增加到终止条件并用这些新参数调用自己”
当终止条件可以有异常时,它将变得很复杂。 因为如果您不能简单地将其表示为“如果执行此操作,否则将以增量重做”,则可能会出错...
您的代码有几个问题。
ls
。 ls
为空列表时,结果为1
'(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-ref
和car
也会失败,但这很容易解决:
(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.