首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用循环进行插入排序方案

使用循环进行插入排序方案
EN

Stack Overflow用户
提问于 2022-03-24 15:52:08
回答 1查看 75关注 0票数 1

最近,我第一次学会了略读。我尝试使用一个方案来实现插入对齐。但是,在这个时候,我尝试只使用map、for-each和let循环等迭代来实现它,而不使用递归。但它没有成功,也没有付诸实施。当我尝试实现以下代码时,短语“宏名用作变量”和"set!“出现,导致语法错误。

代码语言:javascript
复制
(define tlst '())
(define (insertion-sort lst)
  (for-each
   (lambda (x)
     (let loop ((temp-lst (cdr(member i (reverse lst)))))
       (cond
        ((> x (car temp-lst)) set! lst (append (reverse(cdr temp-lst))(append i ((member (car temp-lst) (lst))))) )
        (else (loop (cdr temp-lst)))
        )
       )
     )
   lst
   )
  )

我居住的地方不是一个讲英语的国家,所以我写了一篇文章,因为我不能仅仅用我的语言获得相关的知识。

EN

回答 1

Stack Overflow用户

发布于 2022-03-28 16:29:12

递归插入排序示例来自普利采什·什里瓦斯塔瓦

代码语言:javascript
复制
; sorts a list l in increasing order
; List-of-numbers -> List-of-numbers
(define (insertion-sort l)
  (cond
    [(null? l) '() ]
    [else (insert (car l) (insertion-sort (cdr l))) ]))

; We now define the 'insert' function from our wish list, after which our problem is solved.
; Helper function that inserts a number n into a sorted list of numbers l at its correct position 
; Number List-of-numbers -> List-of-numbers
(define (insert n l)
  (cond
    [(null? l) (cons n '()) ]
    [else (if (<= n (first l))
              (cons n l)
              (cons (car l) (insert n (cdr l)))) ]))

; testing the insert sort function with an example
(insertion-sort '(72 45 43 29 34))

可以将insertion-sort中的递归调用替换为命名的let中的“累加器参数”:

代码语言:javascript
复制
(define (insertion-sort l) ;; List-of-numbers -> List-of-numbers
  ;; produce copy of l sorted in increasing order
  (let build-result ([l l] [result '()])
    (cond
      [(null? l) result ]
      [else (build-result (cdr l) (insert (car l) result)) ])))

( build-result调用处于尾部位置,因此这是一种迭代计算。)

类似地,在insert中(由cons构建的部分结果,因此需要reverse):

代码语言:javascript
复制
(define (insert n l) ;; Number List-of-numbers -> List-of-numbers
  ;; produce result of inserting n into sorted l (may share tail of l)
  (let insert-n ([l l] [result '()])
    (cond
      [(null? l) (append (reverse result) (list n)) ]
      [else (if (<= n (first l))
                (append (reverse result) (list n) l)
                (insert-n (cdr l) (cons (first l) result))) ])))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71605558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档