(define (diagonal? col a)
 (cond
   [(null? a) #f]
   [(= (abs(- (car a) col)) (abs (- (+ (length a) 1) (length a))))]
   [else #f]))

我想让它重复检查列表a中的第二个条件,只有当它到达列表的末尾时才返回true或false我也不想它改变列表a。
我想得到
>(iQueens '(1 2 3 4) '())
> (iQueens '(2 3 4) '(1))
> >(iQueens '(2 4) '(3 1))
< <'()
> >(iQueens '(2 3) '(4 1))
> >(iQueens '(3) '(2 4 1))
< < '()
< <'()
< '()

但是我得到了
>(iQueens '(1 2 3 4) '())
> (iQueens '(2 3 4) '(1))
> >(iQueens '(2 4) '(3 1))
< <'()
> >(iQueens '(2 3) '(4 1))
< <'()
< '()

输入/输出包括“对角线?”
>(iQueens '(1 2 3 4) '())
> (diagonal? 1 '())
< #f
> (iQueens '(2 3 4) '(1))
> >(diagonal? 2 '(1))
< <#t
> >(diagonal? 3 '(1))
> >(diagonal? 3 '())
< <#f
> >(iQueens '(2 4) '(3 1))
> > (diagonal? 2 '(3 1))
< < #t
> > (diagonal? 4 '(3 1))
< < #t
< <'()
> >(diagonal? 4 '(1))
> >(diagonal? 4 '())
< <#f
> >(iQueens '(2 3) '(4 1))
> > (diagonal? 2 '(4 1))
> > (diagonal? 2 '(1))
< < #t
> > (diagonal? 3 '(4 1))
< < #t
< <'()
< '()
> (diagonal? 2 '())
< #f
> (iQueens '(1 3 4) '(2))
> >(diagonal? 1 '(2))
< <#t
> >(diagonal? 3 '(2))
< <#t
> >(diagonal? 4 '(2))
> >(diagonal? 4 '())
< <#f
> >(iQueens '(1 3) '(4 2))
> > (diagonal? 1 '(4 2))
> > (diagonal? 1 '(2))
< < #t
> > (diagonal? 3 '(4 2))
< < #t
< <'()
< '()
> (diagonal? 3 '())
< #f
> (iQueens '(1 2 4) '(3))
> >(diagonal? 1 '(3))
> >(diagonal? 1 '())
< <#f
> >(iQueens '(2 4) '(1 3))
> > (diagonal? 2 '(1 3))
< < #t
> > (diagonal? 4 '(1 3))
> > (diagonal? 4 '(3))
< < #t
< <'()
> >(diagonal? 2 '(3))
< <#t
> >(diagonal? 4 '(3))
< <#t
< '()
> (diagonal? 4 '())
< #f
> (iQueens '(1 2 3) '(4))
> >(diagonal? 1 '(4))
> >(diagonal? 1 '())
< <#f
> >(iQueens '(2 3) '(1 4))
> > (diagonal? 2 '(1 4))
< < #t
> > (diagonal? 3 '(1 4))
> > (diagonal? 3 '(4))
< < #t
< <'()
> >(diagonal? 2 '(4))
> >(diagonal? 2 '())
< <#f
> >(iQueens '(1 3) '(2 4))
> > (diagonal? 1 '(2 4))
< < #t
> > (diagonal? 3 '(2 4))
< < #t
< <'()
> >(diagonal? 3 '(4))
< <#t
< '()
<'()
0

我想我终于明白了,这种情况背后的逻辑是不正确的但在纸上逻辑对我来说是有意义的你能给我一个提示,我在第二部分的逻辑上哪里出错了吗?我对输出如此类似于我所需要的答案感到十分迟疑我想我的代码一定是错的,不是我的逻辑。
*编辑
(define (diagonal? col a count)
 (if
   (null? a)
   #f
   (if(or (= (car a) (+ col count)) (= (car a) (- col count)))
    #t
(diagonal? col (cdr a) (+ 1 count))
)))

这个逻辑起作用但我被迫使用count我仍然不知道如何才能将其更改为不使用我试图避免的第三个参数。
*编辑
为了让上面的对角线起作用
(λ(x) (if(not (diagonal? x a 1) )
                (iQueens (remove x l) (cons x a))
                '()))
                 l)))

我想要的是
(λ(x) (cond
           [(diagonal? x a) (cdr l) '()]
           [else (iQueens (remove x l) (cons x a))]))l)))

最佳答案

您仍然没有给出diagonal?的示例输入和输出,但我的尝试是:

(define (diagonal? col len elt)
  (= (abs (- elt col))
     (abs (- (+ len 1) len)))) ; this is constant 1

(define (diagonals? col lst)
  (define len (length lst))
  (andmap (lambda (elt) (diagonal? len col elt)) lst))

diagonal?只在一个元素上操作,diagonals?处理整个列表。
如您所见,表达式(abs (- (+ len 1) len)))实际上是常数1,因此在初始过程中这可能不正确另外,我假设您希望列表中的所有元素都验证谓词,否则您必须使用ormap而不是andmap
> (diagonals? 2 '(4 1))
#f

编辑
我只能猜测,因为你没有提供足够的信息,但这也许有帮助,假设计数从0开始(如果不是,只需更改in-naturals调用):
(define (diagonal? col a)
  (for/or ((i (in-list a)) (count (in-naturals)))
    (or (= i (+ col count)) (= i (- col count)))))

09-28 03:38