List 从scheme中的列表中获取元素

List 从scheme中的列表中获取元素,list,position,scheme,element,List,Position,Scheme,Element,我需要做一个函数,从给定位置的列表中返回一个元素。例如,该列表中第三个位置的元素2 4 3 5将是3 我有这个代码,但它没有运行 (define (getElement lst pos) (if (= pos 0) (car lst)) (if (> pos 0) (getElement (cdr lst) (- pos 1)))) 如何修复此问题?您正在寻找的过程称为-请记住,索引是基于零的,因此第三个元素将位于索引2。例如: (list-ref '(2

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

我有这个代码,但它没有运行

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

如何修复此问题?

您正在寻找的过程称为-请记住,索引是基于零的,因此第三个元素将位于索引2。例如:

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

现在,如果你想从头开始执行这个过程,你必须考虑三个案例,你当前的解决方案不太正确。问问自己:

如果列表为空或给定索引超出输入列表的有效值范围,会发生什么情况?然后您必须返回一个适当的值,比如f,否则将发出错误信号 如果当前位置为零,会发生什么情况?这意味着我们找到了元素,它是当前元素 否则,继续遍历列表并从位置中减去一 我会给你一些提示,注意使用cond而不是嵌套ifs更容易编写。填空:

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

您正在寻找的过程称为-请记住索引是基于零的,因此第三个元素将位于索引2。例如:

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

现在,如果你想从头开始执行这个过程,你必须考虑三个案例,你当前的解决方案不太正确。问问自己:

如果列表为空或给定索引超出输入列表的有效值范围,会发生什么情况?然后您必须返回一个适当的值,比如f,否则将发出错误信号 如果当前位置为零,会发生什么情况?这意味着我们找到了元素,它是当前元素 否则,继续遍历列表并从位置中减去一 我会给你一些提示,注意使用cond而不是嵌套ifs更容易编写。填空:

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

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

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

(define (getElement lst pos)
  expression-1
  expression-2)
除非您正在进行显示、定义、设置!,设置汽车!,设置cdr!或者,任何可变操作expresion-1都不会执行任何操作,因为它是过程结果表达式2的结果。尾部表情

国际单项体育联合会的形式如下:

(if predicate-expression
    consequent-expression
    alternative-expression)
现在。备选方案是可选的,这意味着方案实现会将其设置为某个值,可能是t。没关系。你的假设是:

(if (> pos 0)
    (getElement (cdr lst) (- pos 1)))
    'implementation-dependent-alternative-value)
这是尾部,如果pos大于0,您将递归到它不大于0,然后依赖于实现的替代值将始终是最终结果。有些实现不显示其默认值,因此您甚至可能在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))))

因此,规则是:在过程主体中,不要让多个语句处于尾部位置,除非它们有副作用。i、 e.定义本地程序

斯卡有正确的解决方案,我想我只想指出你为什么没有得到你想要的答案

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

(define (getElement lst pos)
  expression-1
  expression-2)
除非您正在进行显示、定义、设置!,设置汽车!,设置cdr!或者,任何可变操作expresion-1都不会执行任何操作,因为它是过程结果表达式2的结果。尾部表情

国际单项体育联合会的形式如下:

(if predicate-expression
    consequent-expression
    alternative-expression)
现在。备选方案是可选的,这意味着方案实现会将其设置为某个值,可能是t。没关系。你的假设是:

(if (> pos 0)
    (getElement (cdr lst) (- pos 1)))
    'implementation-dependent-alternative-value)
这是尾部,如果pos大于0,您将递归到它不大于0,然后依赖于实现的替代值将始终是最终结果。有些实现不显示其默认值,因此您甚至可能在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))))

因此,规则是:在过程主体中,不要让多个语句处于尾部位置,除非它们有副作用。i、 e.定义本地过程

我认为你应该在if开始之前添加一个空lst检查。@RSahu这是一个干净的实现,给出我写的句子>长度lst pos必须是t。差异将是一个更精确的错误。当然,您可以创建一个完全不同的过程,当您无法生成结果时,您有一个特定的行为,但这不是列表引用实现。我认为您应该在if开始之前添加一个空lst检查。@RSahu这是一个干净的实现,请给出我写的句子>长度lst pos必须是t。差异将是一个更精确的错误。当然你可以做一个完全不同的程序 当您无法生成结果,但这不是列表引用实现时,请创建一个特定的行为。