【问题标题】:Position in list scheme在列表方案中的位置
【发布时间】:2014-04-16 02:24:41
【问题描述】:

我不确定如何执行此操作,也无法在任何地方找到它的示例。如何在列表中找到值的位置。例如,我有一个(define findValue x lst),它接受一个值和列表,我想从该列表中输入(findValue 3 '(1 2 0 8 5 6)),它应该返回 0,因为位置 3 的值是 0。根据我的理解,它通常是位置 3 会至少在数组中为 8 而不是 0。它在这里是如何工作的,我该如何解决这个问题?

谢谢!

【问题讨论】:

    标签: functional-programming scheme


    【解决方案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
    

    希望有所帮助。

    【讨论】:

    • 谢谢!现在更有意义了,我没有意识到 n 控制索引。
    • 好吧,我不妨问问你,以防你比我更了解这一点。我试图把它放入一个返回函数类型的函数中。因此,例如调用(position 3) 将返回与原始问题相同的结果。我理解返回另一个函数的简单函数,但我无法轻松掌握这个函数。
    • 我已经更新了我的答案。这是你想做的吗?
    • 是的,你是对的,我几天前就想通了,它只是添加了 lambda 并在其中添加了另一个函数。谢谢!
    【解决方案2】:

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

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

    解释:

    • 如果作为参数接收的列表为空或索引变为负数,我们将其视为特殊情况并返回#f 表示未找到该值
    • 如果索引是1,那么我们就在我们想要的地方,所以是时候返回当前元素了
    • 否则提前递归:从索引中减去 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
    

    【讨论】:

    • 所以基本上你是在强制索引从 1 开始?所以如果我输入((= idx 2)) 它会在 2 开始索引?从来没有对其他任何事情做过这样的事情,所以这是不同的。
    • @user2318083 是的,在某种程度上我们声明1 的索引是我们想要开始计数的地方。请注意,您还必须考虑在我们达到所需索引之前列表为空的情况,或者索引为负数的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2014-03-17
    • 1970-01-01
    • 2010-12-25
    相关资源
    最近更新 更多