Functional programming 也可以使用迭代for循环和set!,尽管这通常不是首选: (define (asc? l) (define res #t) (for ((i (sub1 (length l))) #:when (not(< (list-ref l i) (list-ref l (add1 i))))) (set! res #f) ) res)

Functional programming 也可以使用迭代for循环和set!,尽管这通常不是首选: (define (asc? l) (define res #t) (for ((i (sub1 (length l))) #:when (not(< (list-ref l i) (list-ref l (add1 i))))) (set! res #f) ) res),functional-programming,lisp,racket,typed-racket,Functional Programming,Lisp,Racket,Typed Racket,输出: #t #f 非常感谢你,巴尔马先生!我真的很感谢你的帮助。非常感谢你,巴尔马先生!我真的很感谢你的帮助。它可能会有一点速度,但通常对于有趣的大小数据,O(n log n)与O(n)不太可能是瓶颈。我们只想检查元素是否被排序而不是无条件地排序的情况正是复杂度很重要的情况。检查通常被认为是一个更简单的操作,在这里你打破了这个期望,所以它从一个负数开始,即使考虑到实用的观点。我们从中得到了什么?表达高层次的想法。。。。。。属性足以实现它。适合于证明或抽象推理的逻辑公式不能自动转化为操作步骤。

输出:

#t
#f

非常感谢你,巴尔马先生!我真的很感谢你的帮助。非常感谢你,巴尔马先生!我真的很感谢你的帮助。它可能会有一点速度,但通常对于有趣的大小数据,O(n log n)与O(n)不太可能是瓶颈。我们只想检查元素是否被排序而不是无条件地排序的情况正是复杂度很重要的情况。检查通常被认为是一个更简单的操作,在这里你打破了这个期望,所以它从一个负数开始,即使考虑到实用的观点。我们从中得到了什么?表达高层次的想法。。。。。。属性足以实现它。适合于证明或抽象推理的逻辑公式不能自动转化为操作步骤。即使您不应该过早地进行优化,但实现中仍会出现一种类似于神经过敏的情况,特别是对于这些基本的事情。另请参阅:@coredump我倾向于分析实际应用程序而不是纸上谈兵的优化理论;从正确的事情开始,然后看看是否需要更快;和可读的可维护代码。我经常试着遵循这个家伙的建议:当涉及到程序设计时。(1)既然你没有定义排序,我可以假设这是一个Racket,它不会删除相同的元素:你的“set”属性不成立;文档中没有任何地方保证
sort
在已排序时返回相同的列表。它可能是复制品。正确的代码不应该依赖这样的实现细节(您使用的是
eq?
)。(2) 为什么快速代码一定很难阅读<代码>(列表中的(ab)循环,而CL中的b始终(正确且快速。剖析很好,但不能成为糟糕设计的借口。Lamport不会写入O(n.log n)版本。@coredump已将
eq?
更改为
equal?
,这对于成对操作是合适的。感谢您指出我在12am实现中关于列表属性的错误。我不明白你关于集合的观点。比较是在集合的基数和列表中元素的数量之间进行的。如果值不同,则列表中包含重复项。是的,
sort
内置于#lang racket中,因为它比我自己能玩的任何东西都经过更好的测试。奇怪的是,循环如何返回关于montonicity和unique值的不同错误消息。它可能会有一点速度,但通常对于有趣的大小数据,O(n logn)和O(n)不太可能是瓶颈。我们只想检查元素是否被排序而不是无条件地排序的情况正是复杂度很重要的情况。检查通常被认为是一个更简单的操作,在这里你打破了这个期望,所以它从一个负数开始,即使考虑到实用的观点。我们从中得到了什么?表达高层次的想法。。。。。。属性足以实现它。适合于证明或抽象推理的逻辑公式不能自动转化为操作步骤。即使您不应该过早地进行优化,但实现中仍会出现一种类似于神经过敏的情况,特别是对于这些基本的事情。另请参阅:@coredump我倾向于分析实际应用程序而不是纸上谈兵的优化理论;从正确的事情开始,然后看看是否需要更快;和可读的可维护代码。我经常试着遵循这个家伙的建议:当涉及到程序设计时。(1)既然你没有定义排序,我可以假设这是一个Racket,它不会删除相同的元素:你的“set”属性不成立;文档中没有任何地方保证
sort
在已排序时返回相同的列表。它可能是复制品。正确的代码不应该依赖这样的实现细节(您使用的是
eq?
)。(2) 为什么快速代码一定很难阅读<代码>(列表中的(ab)循环,而CL中的b始终(正确且快速。剖析很好,但不能成为糟糕设计的借口。Lamport不会写入O(n.log n)版本。@coredump已将
eq?
更改为
equal?
,这对于成对操作是合适的。感谢您指出我在12am实现中关于列表属性的错误。我不明白你关于集合的观点。比较是在集合的基数和列表中元素的数量之间进行的。如果值不同,则列表中包含重复项。是的,
sort
内置于#lang racket中,因为它比我自己能玩的任何东西都经过更好的测试。好奇循环如何返回关于montonicity和unique值的不同错误消息。这个问题是关于键入的Racket,而不是CL,但是如果您只是删除
#'
并将
T
更改为
#T
,您的答案将是正确的。这个问题是关于键入的Racket,而不是CL,但是如果您只是删除了
#“
并将
T
更改为与此过程无关的
#T
@benrudgers,您的答案将是正确的。当使用空列表作为输入时,OP似乎希望返回问题“此列表是否按升序排列?”的
#f
。我个人认为它应该返回
#t
,因为空列表不是按升序排列的。我回答的最后一部分也谈到了抛出和出错的可能性。@benrudgers,这与这个过程无关。当使用空列表作为输入时,OP似乎希望返回问题“此列表是否按升序排列?”的
#f
。我个人认为它应该返回
#t
,因为空列表不是n
(define (ascending x)
  (match x
    ('() #f) ;; Empty list is error
    ((cons hd '()) #t) ;; 1-element is success
    ((cons hd tl)
     (if (< hd (second x))
         (ascending tl)
         #f))))
(and (< hd (second x)) (ascending tl))
 #lang typed/racket
 (: strictly-ordered-list? : (Listof Integer) -> Boolean)
 (define (strictly-ordered-list? xs) 
   (define sorted (sort xs <))
     (and (equal? xs sorted)
       (= (set-count (list->set xs))
          (length sorted))))
(apply #'< '(1 2 3 4)) => T
(: ascending? : (Listof Integer) -> Boolean :)
(define (ascending? xs)
  (match xs
    [(list)           #f] ;; empty list is not considered ascending
    [(list a)         #t] ;; single-element list is always ascending
    ;; match first two elements (a, b) and remaining elements as c
    ;; a should be less than b, and recurse
    [(list a b c ...) (and (< a b) (ascending? (cons b c)))]))
(ascending? '())               ;; => #f
(ascending? '(1))              ;; => #t
(ascending? '(1 2))            ;; => #t
(ascending? '(1 2 3 4 5 6 7))  ;; => #t
(ascending? '(1 2 3 1))        ;; => #f
(: ascending? : (Listof Integer) -> Boolean :)
(define (ascending? xs)
  (match xs
    [`()               #f]
    [`(,a)             #t]
    [`(,a . (,b . ,c)) (and (< a b) (ascending? (cons b c)))]))
...
(match xs
  [(list) (error 'ascending? "empty list given")]
  ...
(define (asc? l)
  (define res #t)
  (for ((i (sub1 (length l)))
        #:when (not(< (list-ref l i)
                      (list-ref l (add1 i)))))
    (set! res #f)
    )
  res)
(asc? (list 1 2 3 4 5))

(asc? (list 1 2 3 4 5 4))
#t
#f