Recursion 在球拍中编写交替序列检查器

Recursion 在球拍中编写交替序列检查器,recursion,math,scheme,racket,Recursion,Math,Scheme,Racket,我试图做一个程序,确定是否输入的名单交替在签名。例如,如果给定列表:[-1,5,-10]或[5,-17,25],我的程序将返回true。如果给定列表:[-1,-5,6]或[1,-2,-6],程序将返回false 我试着做一个简单的cond语句,检查列表中第一个数字的符号,然后检查列表中的第二个数字,确保第一个数字是正数,第二个数字是负数,或者第一个数字是负数,第二个数字是正数 (define (alternating-signs-in-list? lst) (cond [(

我试图做一个程序,确定是否输入的名单交替在签名。例如,如果给定列表:[-1,5,-10]或[5,-17,25],我的程序将返回true。如果给定列表:[-1,-5,6]或[1,-2,-6],程序将返回false

我试着做一个简单的cond语句,检查列表中第一个数字的符号,然后检查列表中的第二个数字,确保第一个数字是正数,第二个数字是负数,或者第一个数字是负数,第二个数字是正数

(define (alternating-signs-in-list? lst)
  (cond 
        [(> (first lst) 0)
         (cond [(< (first (rest lst)) 0) (alternating-signs-in-list? (rest lst))])]
        [(< (first lst) 0)
         (cond [(> (first (rest lst)) 0) (alternating-signs-in-list? (rest lst))])]
        [else false]))

为什么会发生下面的错误,并且有没有一个简单的修复方法可以让我的代码开始工作。多谢各位

技巧是同时比较元素对(列表的第一个和第二个),直到列表用尽。您收到的错误是因为您忘记处理空列表案例,特别是对于这个问题,我们还需要在列表只剩下一个元素时处理该案例

在继续之前,执行
相同符号?
过程很有用,如果我们利用该过程(返回数字的符号),并且假设
0
为正,则很容易:

(define (same-sign? n1 n2)
  ; they have the same sign if their `sgn` value is the same
  (= (if (zero? n1) 1 (sgn n1))
     (if (zero? n2) 1 (sgn n2))))
主要程序如下:

(define (alternating-signs-in-list? lst)
  (cond ((or (empty? lst) (empty? (rest lst))) #t) ; empty list / single element case
        ((same-sign? (first lst) (second lst)) #f) ; they are NOT alternating
        (else (alternating-signs-in-list? (rest lst))))) ; advance recursion
或者,我们也可以使用布尔连接器编写上述内容:

(define (alternating-signs-in-list? lst)
  (or (empty? lst)
      (empty? (rest lst))
      (and (not (same-sign? (first lst) (second lst)))
           (alternating-signs-in-list? (rest lst)))))
无论哪种方式,它都能按预期工作:

(alternating-signs-in-list? '(-1 5 -10))
=> #t
(alternating-signs-in-list? '(5 -17 25))
=> #t
(alternating-signs-in-list? '(-1 -5 6))
=> #f
(alternating-signs-in-list? '(1 -2 -6))
=> #f

诀窍是同时比较元素对(列表的第一个和第二个),直到列表用尽。您收到的错误是因为您忘记处理空列表案例,特别是对于这个问题,我们还需要在列表只剩下一个元素时处理该案例

在继续之前,执行
相同符号?
过程很有用,如果我们利用该过程(返回数字的符号),并且假设
0
为正,则很容易:

(define (same-sign? n1 n2)
  ; they have the same sign if their `sgn` value is the same
  (= (if (zero? n1) 1 (sgn n1))
     (if (zero? n2) 1 (sgn n2))))
主要程序如下:

(define (alternating-signs-in-list? lst)
  (cond ((or (empty? lst) (empty? (rest lst))) #t) ; empty list / single element case
        ((same-sign? (first lst) (second lst)) #f) ; they are NOT alternating
        (else (alternating-signs-in-list? (rest lst))))) ; advance recursion
或者,我们也可以使用布尔连接器编写上述内容:

(define (alternating-signs-in-list? lst)
  (or (empty? lst)
      (empty? (rest lst))
      (and (not (same-sign? (first lst) (second lst)))
           (alternating-signs-in-list? (rest lst)))))
无论哪种方式,它都能按预期工作:

(alternating-signs-in-list? '(-1 5 -10))
=> #t
(alternating-signs-in-list? '(5 -17 25))
=> #t
(alternating-signs-in-list? '(-1 -5 6))
=> #f
(alternating-signs-in-list? '(1 -2 -6))
=> #f

代码的主要问题是您忘记了递归的基本情况!您必须始终检查空列表的情况,有时还要检查单元素的情况。代码的主要问题是您忘记了递归的基本情况!您必须始终检查空列表的情况,有时还要检查单元素的情况。我有一个简单的问题。我曾经使用过(第一个lst),(第二个lst)和(其他lst),但从未使用过(其他lst))。这是什么意思?那是一个错误:)检查代码,它不再存在了。事实并非如此,但有时我们需要在列表中一次推进两个元素。我有一个简短的问题。我曾经使用过(第一个lst),(第二个lst)和(其他lst),但从未使用过(其他lst))。这是什么意思?那是一个错误:)检查代码,它不再存在了。事实并非如此,但有时我们需要在列表中一次推进两个元素。