Recursion 检查Racket中列表的升序

Recursion 检查Racket中列表的升序,recursion,scheme,lisp,racket,Recursion,Scheme,Lisp,Racket,我是racket的新手,我正在尝试编写一个函数来检查列表是否严格按升序排列 "(1 2 3)将返回true “(12)将返回false(重复) "(3 2 4)将返回false 到目前为止,我的代码是: 我想打电话给你?递归地,我的基本情况是列表为空或只有1个元素(然后是简单的升序) 当我使用CHECK时,我会不断地得到错误信息,比如说“应用程序:不是一个程序”。 < P>编写函数时要考虑的一些事情: 避免使用内置函数作为变量名。例如,list是一个内置过程,返回一个新分配的列表,因此不要将

我是racket的新手,我正在尝试编写一个函数来检查列表是否严格按升序排列

"(1 2 3)将返回true “(12)将返回false(重复) "(3 2 4)将返回false

到目前为止,我的代码是:

我想打电话给你?递归地,我的基本情况是列表为空或只有1个元素(然后是简单的升序)


当我使用CHECK时,我会不断地得到错误信息,比如说“应用程序:不是一个程序”。

< P>编写函数时要考虑的一些事情:

  • 避免使用内置函数作为变量名。例如,
    list
    是一个内置过程,返回一个新分配的列表,因此不要将其用作函数的参数或变量。一种常见的约定/替代方法是使用
    lst
    作为列表的变量名,因此可以使用
    (定义(升序?lst)…
  • 不要引用变量名。例如,您将有
    (定义lst'(1 2 3…)
    ,而不是
    (定义'lst'(1 2 3…)
  • 如果您有多个条件要测试(即超过2个),那么使用它可能比嵌套多个
    If
    语句更干净
要修复您的
升序?
(在替换
”列表后,
),请注意第3行中的
(>first(first(rest list)))
。这里您正在比较
第一个
(第一个(rest列表))
,但是您真正想要的是比较
(第一个lst)
(第一个(rest lst))
,所以它应该是
(>=(第一个lst)(第一个(rest lst))

下面是一个示例实现:

(define (ascending? lst)
  (cond
    [(null? lst) #t]
    [(null? (cdr lst)) #t]
    [(>= (car lst) (cadr lst)) #f]
    [else
     (ascending? (cdr lst))]))
或者,如果要使用
first/rest
true/false
,可以执行以下操作:

(define (ascending? lst)
  (cond
    [(empty? lst) true]
    [(empty? (rest lst)) true]
    [(>= (first lst) (first (rest lst))) false]
    [else
     (ascending? (rest lst))]))
比如说,

> (ascending? '(1 2 3))
#t
> (ascending? '(1 1 2))
#f
> (ascending? '(3 2 4))
#f

编写函数时要考虑的一些事项:

  • 避免使用内置函数作为变量名。例如,
    list
    是一个内置过程,返回一个新分配的列表,因此不要将其用作函数的参数或变量。一种常见的约定/替代方法是使用
    lst
    作为列表的变量名,因此可以使用
    (定义(升序?lst)…
  • 不要引用变量名。例如,您将有
    (定义lst'(1 2 3…)
    ,而不是
    (定义'lst'(1 2 3…)
  • 如果您有多个条件要测试(即超过2个),那么使用它可能比嵌套多个
    If
    语句更干净
要修复您的
升序?
(在替换
”列表后,
),请注意第3行中的
(>first(first(rest list)))
。这里您正在比较
第一个
(第一个(rest列表))
,但是您真正想要的是比较
(第一个lst)
(第一个(rest lst))
,所以它应该是
(>=(第一个lst)(第一个(rest lst))

下面是一个示例实现:

(define (ascending? lst)
  (cond
    [(null? lst) #t]
    [(null? (cdr lst)) #t]
    [(>= (car lst) (cadr lst)) #f]
    [else
     (ascending? (cdr lst))]))
或者,如果要使用
first/rest
true/false
,可以执行以下操作:

(define (ascending? lst)
  (cond
    [(empty? lst) true]
    [(empty? (rest lst)) true]
    [(>= (first lst) (first (rest lst))) false]
    [else
     (ascending? (rest lst))]))
比如说,

> (ascending? '(1 2 3))
#t
> (ascending? '(1 1 2))
#f
> (ascending? '(3 2 4))
#f

我猜你想从头开始实现一个过程,亚历山大的答案是正确的。但在真正的函数式编程风格中,您应该尝试重用现有的过程来编写解决方案。这就是我的意思:

(define (ascending? lst)
  (apply < lst))

我猜你想从头开始实现一个过程,亚历山大的答案是正确的。但在真正的函数式编程风格中,您应该尝试重用现有的过程来编写解决方案。这就是我的意思:

(define (ascending? lst)
  (apply < lst))

此方案解决方案使用名为
let
的显式递归,并:

(定义(升序?xs)
(if(null?xs)#t;边缘大小写:空列表
(let asc?((x(car xs));名为'let'`
(xs(cdr xs))
(如果(null?xs')#t
(let((x)(car-xs'));对`(car-xs')的记忆`
(如果(
此方案解决方案使用名为
let
的显式递归,并且:

(定义(升序?xs)
(if(null?xs)#t;边缘大小写:空列表
(let asc?((x(car xs));名为'let'`
(xs(cdr xs))
(如果(null?xs')#t
(let((x)(car-xs'));对`(car-xs')的记忆`
(如果(
如果您以项目符号形式写下升序列表的属性

升序列表是

  • 空列表,或
  • 单元素列表,或
  • 一份清单
    • 第一个元素小于第二个元素,并且
    • 列表的尾部是升序
你可以得到一个非常直接的翻译:

(define (ascending? ls)
  (or (null? ls)
      (null? (rest ls))
      (and (< (first ls) (first (rest ls)))
           (ascending? (rest ls)))))
(定义(升序?ls)
(或(空?ls)
(空?(剩余ls))
(和(<(第一排)(第一排)
(上升?(其余部分为(())))

如果您以项目符号形式写下升序列表的属性

升序列表是

  • 空列表,或
  • 单元素列表,或
  • 一份清单
    • 第一个元素小于第二个元素,并且
    • 列表的尾部是升序
你可以得到一个非常直接的翻译:

(define (ascending? ls)
  (or (null? ls)
      (null? (rest ls))
      (and (< (first ls) (first (rest ls)))
           (ascending? (rest ls)))))
(定义(升序?ls)
(或(空?ls)
(空?(剩余ls))
(和(<(第一排)(第一排)
(上升?(其余部分为(())))

请不要发布代码的图像;将代码放在实际问题中。