列表方案中的位置

时间:2014-04-16 02:24:42

标签: functional-programming scheme

我不知道该怎么做,也无法在任何地方找到它的例子。如何在列表中找到值的位置。例如,我有一个(define findValue x lst)接受一个值和列表,从列表中我想要输入(findValue 3 '(1 2 0 8 5 6))并且它应该返回0,因为位置3中的值是0.从我的理解和它通常如何至少,位置3将是8而不是数组中的0。它在这里是如何工作的,我该如何解决这个问题?

谢谢!

2 个答案:

答案 0 :(得分:1)

尝试:

(define (at n xs)
    (cond ((null? xs) xs)
          ((= n 1) (car xs))
          (else (at (- n 1) (cdr xs)))))

按如下方式使用:

(at 3 '(1 2 0 8 5 6)) => 0

对于从零开始的索引,将第3行的(= n 1)检查更改为(= n 0)

修改:您想部分应用at功能吗?您所需要的只是curryflip。它们的定义如下:

(define (curry func . args)
    (lambda x (apply func (append args x))))

(define (flip func)
    (lambda (a b) (func b a)))

使用curryflip,您现在可以部分应用at,如下所示:

(define position (curry (flip at) '(1 2 0 8 5 6)))

您现在可以使用position,如下所示:

(position 3) => 0
(position 4) => 8

希望有所帮助。

答案 1 :(得分:1)

通常从0开始计算索引,您的理解是正确的。但是,如果您需要实现一个findValue过程来开始计算1的索引,那么编写过程就不那么难了:

(define (findValue idx lst)
  (cond ((or (null? lst) (negative? idx)) #f)
        ((= idx 1) (car lst))
        (else (findValue (sub1 idx) (cdr lst)))))

说明:

  • 如果作为参数收到的列表为空或索引变为负数,我们将其视为特殊情况并返回#f以指示未找到该值
  • 如果索引是1,那么我们就在我们想要的位置,所以是时候返回当前元素了
  • 否则推进递归:从索引中减去一个并在列表上前进一个位置

按预期工作:

(findValue  3 '(1 2 0 8 5 6))
=> 0
(findValue -1 '(1 2 0 8 5 6))
=> #f
(findValue  7 '(1 2 0 8 5 6))
=> #f