gpt4 book ai didi

scheme - Racket 迭代和递归

转载 作者:太空宇宙 更新时间:2023-11-03 19:04:38 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com