scheme - Racket 迭代和递归

标签 scheme lisp racket

(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))
)))

这个逻辑有效...但我被迫使用计数...我仍然无法弄清楚如何更改它以不使用我试图避免的第三个参数。

*编辑

为了让上面的对角线起作用,我使用了

(λ(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)))))

关于scheme - Racket 迭代和递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25791024/

相关文章:

scheme - Scheme/Lisp 中的迭代范围函数

scheme, sicp, solution 3.19, procedure with infinite loop works in case it provided as argument

list - Racket 中高效的随机数列表总和

scheme - 如何将 Scheme 列表分解为要传递给过程的 args?

scheme - 在 Racket 中写负数

lisp - SBCL - 常见的 Lisp 错误

lisp - 你能在没有 REPL 的情况下在 Lisp 上编程吗?

lisp - Scheme中的Push和Pop怎么写?

lambda - 方案: "mcar: contract violation, expected: mpair, given: #<procedure:..."

arrays - Racket:宏输出一些奇怪的东西而不是数组