Scheme Racket迭代与递归

Scheme Racket迭代与递归,scheme,lisp,racket,Scheme,Lisp,Racket,我希望它在列表a上重复检查第二个条件,并且仅在到达列表末尾时返回true或false。我也不希望它改变列表a 我想去 (define (diagonal? col a) (cond [(null? a) #f] [(= (abs(- (car a) col)) (abs (- (+ (length a) 1) (length a))))] [else #f])) 这个逻辑是有效的。。。但我被迫使用计数。。。我仍然不知道如何将其更改为不使用我试图避免的第三个参数 *编辑 为了

我希望它在列表a上重复检查第二个条件,并且仅在到达列表末尾时返回true或false。我也不希望它改变列表a

我想去

(define (diagonal? col a)
 (cond
   [(null? a) #f]
   [(= (abs(- (car a) col)) (abs (- (+ (length a) 1) (length a))))]
   [else #f]))
这个逻辑是有效的。。。但我被迫使用计数。。。我仍然不知道如何将其更改为不使用我试图避免的第三个参数

*编辑

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

(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)))
对角线?
仅对一个元素进行操作,
对角线?
处理整个列表

如您所见,表达式
(abs(-(+len 1)len))
实际上是常量
1
,因此在初始过程中可能不正确。另外,我假设您希望列表的所有元素都应该验证谓词,否则您必须使用
ormap
而不是
和map

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

我只能猜测,因为您没有提供足够的信息,但假设计数从0开始,这可能会有所帮助(如果不是,只需更改naturals中的
调用):

由于您使用的是(语言),而不是Scheme或Common Lisp(标记所指示的Scheme和Lisp),因此您可以只提供一个默认值:

(define (diagonal? col a)
  (for/or ((i (in-list a)) (count (in-naturals)))
    (or (= i (+ col count)) (= i (- col count)))))
在(与racket不同的语言,racket实现也支持这种语言)中,有两种方法可以公开参数比递归过程中使用的参数少的过程。一是当地程序:

(define (diagonal? col a (count 0))
  (cond ((null? a) #f)
        ((or (= (car a) (+ col count)) 
             (= (car a) (- col count)))
         #t)
        (else (diagonal? col (cdr a) (+ 1 count)))))
或者,您可以使用命名let:

(define (diagonal? col a)
  (define (diagonal? col a count)
    (cond ((null? a) #f)
          ((or (= (car a) (+ col count)) 
               (= (car a) (- col count)))
           #t)
          (else (diagonal? col (cdr a) (+ 1 count)))))
  (diagonal? col a 0)) ;; add default values
这只是第一个Scheme示例的语法糖。Racket(语言)也支持这两种语言

在中,您再次具有可选参数:

(define (diagonal? col a)
  (let diagonal? ((col col) (a a) (count 0))
    (cond ((null? a) #f)
          ((or (= (car a) (+ col count)) 
               (= (car a) (- col count)))
           #t)
          (else (diagonal? col (cdr a) (+ 1 count))))))

这只是制作和使用过程的简单方法。在这两种情况下,都使用与公开过程相同的名称创建本地过程。有些人想使用不同的名称或使用辅助后缀。这只是口味的不同,只要你不需要同时调用本地和全局版本。

你能用语言解释第二个条件应该做什么吗?对于列表中的所有元素,它都必须为真,或者如果仅对一个元素为真就足够了吗?我们不知道
a
的内容,当该过程返回true时,您应该发布一个示例输入,其中一个示例输出是预期的,当该过程返回false时,您应该发布一个示例输入。您的意思是过程
对角线
不调用自身吗?实际上没有,因为在过程中没有调用
diagonal
a
是列表吗?请编辑您的问题,并将其精简为基本问题:您拥有的一个或有限数量的代表性输入数据、您的程序,以及每个输入的预期输出和您得到的输出。那么
(对角线?2'(4 1))
的含义是什么呢。这是否意味着“是(第2行第2列)在与(第0行第4列)和(第1行第1列)相同的对角线中?”?在对角线中,从长度a中减去(长度a)+1。那永远是1。女王在你们的节目中是如何表现的?正如@uselpa所说。你没有调用对角线,所以它不能重复。好的,我用第三个参数计算出来了。我是否可以将其更改为仅使用两个原始参数在racket中工作?
(define (diagonal? col a)
  (for/or ((i (in-list a)) (count (in-naturals)))
    (or (= i (+ col count)) (= i (- col count)))))
(define (diagonal? col a (count 0))
  (cond ((null? a) #f)
        ((or (= (car a) (+ col count)) 
             (= (car a) (- col count)))
         #t)
        (else (diagonal? col (cdr a) (+ 1 count)))))
(define (diagonal? col a)
  (define (diagonal? col a count)
    (cond ((null? a) #f)
          ((or (= (car a) (+ col count)) 
               (= (car a) (- col count)))
           #t)
          (else (diagonal? col (cdr a) (+ 1 count)))))
  (diagonal? col a 0)) ;; add default values
(define (diagonal? col a)
  (let diagonal? ((col col) (a a) (count 0))
    (cond ((null? a) #f)
          ((or (= (car a) (+ col count)) 
               (= (car a) (- col count)))
           #t)
          (else (diagonal? col (cdr a) (+ 1 count))))))
(defun diagonalp (col a &optional (count 0))
  (cond ((null a) nil)
        ((or (= (car a) (+ col count)) 
             (= (car a) (- col count)))
         t)
        (t (diagonalp col (cdr a) (+ 1 count)))))