如何在scheme中找到一个列表是否由有序的完美正方形组成?

如何在scheme中找到一个列表是否由有序的完美正方形组成?,scheme,racket,Scheme,Racket,如果列表是方形列表,我想返回true,即如果列表的类型为”(0 1 4 9 16),则返回true 这是我所拥有的(以下),但它会检查列表是否有序。也就是说,如果列表是”(4 0 1 9 16),我的代码将返回true。如何修改我的代码 (define (squares? lst) (cond ((null? lst) #t) ((not( integer? (sqrt(car lst)))) #f) (else (squares? (cdr lst))))) 对于类型

如果列表是方形列表,我想返回true,即如果列表的类型为
”(0 1 4 9 16)
,则返回true

这是我所拥有的(以下),但它会检查列表是否有序。也就是说,如果列表是
”(4 0 1 9 16)
,我的代码将返回
true
。如何修改我的代码

(define (squares? lst)
  (cond
   ((null? lst) #t)
   ((not( integer? (sqrt(car lst)))) #f)
   (else  (squares? (cdr lst)))))

对于类型为
'(4 0 1 9 16)
的列表,我将使用上述代码获得
true
,但答案应该是
false
,因为我的列表不是
'(0 1 4 9 16)
。提前感谢。

您还可以通过上次检查的号码

(define (squares? lst last-n)
然后检查
(车辆lst)
是否大于
last-n

   ((not (< last-n (car lst)) #f)


您可以将
last-n
定义为可选参数,即
(define(squares?lst.last-n))
,但是您必须通过
(car last-n)
访问值,因为所有可选参数都作为一个列表一起传递。

本着函数式编程的真正精神,您应该尝试将问题分成更小的部分,并重用和组合现有的过程

假设列表不需要“完整”,我们只需要创建并调用一个额外的过程来检查列表是否已排序:

(define (square? lst)
  (and (all-squares? lst)
       (sorted? lst)))

(define (all-squares? lst)
  (cond
    ((null? lst) #t)
    ((not (integer? (sqrt (car lst)))) #f)
    (else (all-squares? (cdr lst)))))

(define (sorted? lst)
  (apply <= lst))
不管怎样,它在以下两种实现中都能正常工作:

(square? '(0 1 4 9 16))
=> #t

(square? '(4 0 1 9 16))
=> #f

清单是否也必须“完整”?也就是说,
(1 4 16)
是否是一个“方形列表”?因为
@michaelmaclod捕捉得很好!我更新了它。最好使用
Bravo!非常感谢。
(define (square? lst)
  (and (andmap (compose integer? sqrt) lst)
       (apply <= lst)))
(square? '(0 1 4 9 16))
=> #t

(square? '(4 0 1 9 16))
=> #f