【问题标题】:Get element from list in scheme从方案中的列表中获取元素
【发布时间】:2014-05-28 16:13:51
【问题描述】:

我需要创建一个函数,它从给定位置的给定列表中返回一个元素。例如,此列表中第三个位置的元素 (2 4 3 5) 将是 3。

我有这段代码,但它没有运行。

(define (getElement lst pos)
  (if (= pos 0)
      (car lst))
  (if (> pos 0)
      (getElement (cdr lst) (- pos 1))))

我该如何解决这个问题?

【问题讨论】:

    标签: list position scheme element


    【解决方案1】:

    您要查找的过程称为list-ref - 请记住索引是从零开始的,因此“第三个”元素将位于索引2。例如:

    (list-ref '(2 4 3 5) 2)
    => 3
    

    现在,如果您想从头开始实施该过程,则必须考虑 三种 种情况,您当前的解决方案离正确不远。问问自己:

    • 如果列表为空或给定索引超出输入列表的有效值范围,会发生什么情况?那么您必须返回一个适当的值(例如,#f)或发出错误信号
    • 如果当前位置为零会怎样?这意味着我们找到了元素,它是当前元素
    • 否则,继续遍历列表并从位置中减去一个

    我会给你一些提示,请注意使用cond 而不是嵌套ifs 更容易编写。填空:

    (define (getElement lst pos)
      (cond ((null? lst) <???>)
            ((= pos 0) <???>)
            (else (getElement <???> <???>))))
    

    它就像list-ref

    (getElement '(2 4 3 5) 2)
    => 3
    

    【讨论】:

      【解决方案2】:

      Óscar 有正确的解决方案,我想我只是想指出为什么你没有得到你正在寻找的答案。

      您的过程在其主体中有两个表达式:

      (define (getElement lst pos)
        expression-1
        expression-2)
      

      除非您正在执行 displaydefineset!set-car!set-cdr! 或任何可变操作 expresion-1 不会做任何事情,因为它是 expression-2 的结果,这是结果的程序。 (尾表达式)

      if 的形式如下:

      (if predicate-expression
          consequent-expression
          alternative-expression)
      

      现在。另一种选择是可选的,这意味着 Scheme 实现会将其设置为某个值,可能是 #t。没关系。你的 if 将是:

      (if (> pos 0)
          (getElement (cdr lst) (- pos 1)))
          'implementation-dependent-alternative-value)
      

      这是尾部,如果pos 大于0,您将递归直到不是,然后implementation-dependent-alternative-value 将始终是最终结果。某些实现不显示它们的默认值,因此您甚至可能看不到 REPL 中的任何内容。

      如果您假设列表始终大于索引并且索引始终为正,您可以将谓词连接在一起并将两个结果用作结果和替代。

      ;; name change to conform to Scheme naming convention
      (define (get-element lst pos) 
        (if (<= pos 0)
            (car lst)
            (get-element (cdr lst) (- pos 1))))
      

      所以规则是:除非它们有副作用,否则不要在程序主体中包含多个语句(仅在尾部位置)。 (即define本地程序)

      【讨论】:

      • 我认为您应该在(if 开始之前添加一个空lst 的检查。
      • @RSahu 这是一个干净的实现给我写(&gt; (length lst) pos)的句子必须是#t。差异将是更精确的错误。当然,您可以创建一个完全不同的过程,当您无法产生结果但那不是list-ref 实现时,您有特定的行为。
      【解决方案3】:
       ; to retrieve the 'ith' element in a list
      
       (define ( myGetElement Lst Pos )
          ( if ( null? Lst )       ;if the list is empty 
             ()
             ( if ( = Pos 1 )      
                  ( car Lst ) ;the first position of the list
                  ( myGetElement ( cdr Lst ) ( - Pos 1 ) )
                   ; use recursion to find the next pos
             )
          )
       )
      

      【讨论】:

        猜你喜欢
        • 2011-07-18
        • 2012-10-21
        • 2012-04-04
        • 2015-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多