Scheme 方案递归错误

Scheme 方案递归错误,scheme,racket,Scheme,Racket,这个递归函数似乎工作正常,向结果列表中添加了我想要的字母B和C,然后当它完成时,它正确地看到最后一个元素已经到达 然后它执行基本情况,出现了一个我无法解释的错误。是什么导致了这个错误 (define(preceding-R X Vector result) (if (eq? '() (cdr (vector->list Vector))) result (helper X Vector result)))

这个递归函数似乎工作正常,向结果列表中添加了我想要的字母B和C,然后当它完成时,它正确地看到最后一个元素已经到达

然后它执行基本情况,出现了一个我无法解释的错误。是什么导致了这个错误

    (define(preceding-R X Vector result)    
      (if (eq? '() (cdr (vector->list Vector)))
               result
              (helper X Vector result)))

(define (helper X Vector result)
   (if(eqv? X (cadr (vector->list Vector))) ((set! result (cons result (car (vector->list Vector)))) (preceding-R X (list->vector (cdr (vector->list Vector))) result))
                            (preceding-R X (list->vector (cdr (vector->list Vector))) result)))

(preceding-R 'a #(b a c a) '()))
错误:

程序应用:预期程序,给定:;参数为:。Bc

我添加了begin call。若你们想要多个表达式,若你们不能把它们包装起来,那个么它被解释为set返回的函数调用void!通过递归调用previous-R返回参数


我添加了begin call。若你们想要多个表达式,若你们不能把它们包装起来,那个么它被解释为set返回的函数调用void!通过递归调用previous-R返回参数。

以下是一些并非绝对可怕的代码:

(define preceding-R 
  (lambda (x vec)
    (define helper
      (lambda (ls)
        (cond
          ((null? ls) '())
          ((null? (cdr ls)) '())
          ((eq? (cadr ls) x) (cons (car ls) (helper (cdr ls))))
          (else (helper (cdr ls))))))
    (helper (vector->list vec))))

> (preceding-R 'a #(b a c a))
(b c)
伊莱·巴兹莱说得有道理;如果我对原始代码进行评分,我可能会因为他指出的事情而获得不到一半的学分:

设置在大多数情况下都应该避免,并且在涉及基本方案代码的家庭作业问题上通常是不允许的。必须使用set!这是一个通常的说法,递归没有被很好地理解。 因为begin除了最后一个表达式外,其他所有表达式的结果都会被丢弃,这意味着非尾部表达式会产生像set!所以begin通常也不会出现在教育问题中。 反复转换显然是一种浪费。一次转换就可以了,但您可能已经开始使用列表而不是向量了。列表是Scheme中最常用的数据结构,尤其是因为它们可以很好地处理递归。 您的代码将在第二行的空列表中出错:previous-R'a=>error:trust to apply cdr on' 如果你使用set!若要修改结果,则没有理由传递结果。这是额外的行李。 Eli的最后一点是你可以写:


保存一些重复的代码。

以下是一些并非绝对可怕的代码:

(define preceding-R 
  (lambda (x vec)
    (define helper
      (lambda (ls)
        (cond
          ((null? ls) '())
          ((null? (cdr ls)) '())
          ((eq? (cadr ls) x) (cons (car ls) (helper (cdr ls))))
          (else (helper (cdr ls))))))
    (helper (vector->list vec))))

> (preceding-R 'a #(b a c a))
(b c)
伊莱·巴兹莱说得有道理;如果我对原始代码进行评分,我可能会因为他指出的事情而获得不到一半的学分:

设置在大多数情况下都应该避免,并且在涉及基本方案代码的家庭作业问题上通常是不允许的。必须使用set!这是一个通常的说法,递归没有被很好地理解。 因为begin除了最后一个表达式外,其他所有表达式的结果都会被丢弃,这意味着非尾部表达式会产生像set!所以begin通常也不会出现在教育问题中。 反复转换显然是一种浪费。一次转换就可以了,但您可能已经开始使用列表而不是向量了。列表是Scheme中最常用的数据结构,尤其是因为它们可以很好地处理递归。 您的代码将在第二行的空列表中出错:previous-R'a=>error:trust to apply cdr on' 如果你使用set!若要修改结果,则没有理由传递结果。这是额外的行李。 Eli的最后一点是你可以写:


保存一些重复的代码。

请格式化代码并简要说明代码必须执行的操作。请格式化代码并简要说明代码必须执行的操作。非常感谢,我知道问题与此有关,但我已尝试使用cond解决该问题,因为我知道它默认使用begin。显然,我没有正确地实施它。再次感谢。这个代码太可怕了。它使用set!没有充分的理由,它使用begin只是为了这个,它会在某些情况下抛出错误,它会不断地将向量转换为列表并返回到向量,它在帮助程序的外部级别,当它可以很容易地推到最后一个aregument时,它有if。非常感谢,我知道问题与此有关,但我曾尝试使用cond来解决这个问题,因为我知道它默认使用begin。显然,我没有正确地实施它。再次感谢。这个代码太可怕了。它使用set!没有什么好的理由,它使用begin只是为了这个,它会在某些情况下抛出错误,它会不断地将向量转换为列表并返回到向量,它在helper的外部级别有if,当它可以很容易地被推入到最后一个aregment时,等等。
(define (helper X Vector result)
  (preceding-R X (list->vector (cdr (vector->list Vector)))
               (if (eq? X (cadr (vector->list Vector)))
                   (cons (car (vector->list Vector)) result)
                   result)))