【问题标题】:Only keep numbers in descending order by scheme仅按方案按降序排列数字
【发布时间】:2017-10-10 18:51:45
【问题描述】:

我想写一个函数,只保留降序号,去掉升序号。

例如: (descending '(6 5 3 1 2 8)) 应该给我(6 5 3 1)

谢谢。

【问题讨论】:

  • notAsc 是什么?你的意思是descending
  • 你确定你调用的函数正确吗?这是您在通话中使用撇号的错字吗?
  • 我将函数修改为降序

标签: scheme


【解决方案1】:

列表是将对象绑定到列表的结果。或者一个空列表。

什么是consing?这是一个内置操作。

(define (plain-cons x xs)
  (cond
    ((null? xs) (list x))
    (else (cons x xs))))    ; using the built-in

降序列表是 descend 的结果 - 将一个对象添加到 descend 列表中。或者一个空列表。

什么是下降-consing?它是一个 consing,结果列表也是递减的:

; (descend-cons 3 '())      -> (list 3)
; (descend-cons 8 '(7 3))   -> (cons 8 '(7 3))
; (descend-cons 5 '(8 7 3)) -> (descend-cons 5 '(7 3))

(define (descend-cons x xs)
  (cond
    ((null? xs) (list x))
    (else
       (let ((a (car xs)))
         (cond
           ((>= x a)      ; { 8 '(7 3)) } -> '(8 7 3)
              .... )
           (else          ; { 5 '(8 7 3)) } -> { 5 '(7 3) }
             (.... x 
                   (cdr xs))))))))

有了这个,任务就很简单了。我们将编写函数descending 将列表转换为降序列表,就像

; (descending '())           ->  '()
; (descending '(x y z ...))  ->  (descend-cons x (..... '(y z ...)))

(define (descending lst)
  (cond
    ((null? lst) lst)
    (else
      (let ((x (car lst))
            (xs (cdr lst)))
        (...... x
                (...... xs))))))

descend-cons 期望的第二个参数是什么?它必须是一个降序列表。

我们可以从列表'(y z ...) 中创建一个降序列表吗?我们的武器库中有什么功能可以为我们做到这一点?

【讨论】:

  • 不错的解决方案,但是为什么cond 只有两个术语而至少不需要一个begin
  • @Sylwester 我不知道,也许是为了统一?我在这里首先关注正确性。即,关于问题解决方法。
  • 你知道我的程序有什么问题吗?
  • @flower for (5 8 3) 您的方法将产生 (8 3) 但正确答案是 (5 3)。你能完成我答案中的代码吗?到时候你就清楚了。不要着急,慢慢阅读,确保你理解每一点,然后再继续下一个。如果需要,欢迎您要求澄清。
猜你喜欢
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 2011-05-10
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多