首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么list-ref不能得到正确的参数?

为什么list-ref不能得到正确的参数?
EN

Stack Overflow用户
提问于 2011-07-29 11:48:48
回答 3查看 720关注 0票数 0

我写了一个快速排序的方案(球拍)

代码语言:javascript
复制
#lang racket

(define (quick-sort xs)
  (let* ([p (list-ref xs 0)]
         [tail (list-tail xs 1)]
         [less (filter (lambda (x) (< x p)) tail)]
         [greater (filter (lambda (x) (>= x p)) tail)])
    (append (quick-sort less) (list p) (quick-sort greater))))

但是当我尝试它的时候,我得到了这个错误:

代码语言:javascript
复制
> (quick-sort (list 99 2 9922))
list-ref: index 0 too large for list: '()

我是方案的新手,所以我不太明白为什么list-ref不能获得正确的输入'(99 2 9922)

编辑:

谢谢。我让它起作用了。

代码语言:javascript
复制
#lang racket

(define (quick-sort xs)
  (let* ([p (first xs)]
         [tail (rest xs)]
         [less (filter (lambda (x) (< x p)) tail)]
         [greater (filter (lambda (x) (>= x p)) tail)])
    (if (equal? (length xs) 1) 
      xs
      (append (quick-sort less) (list p) (quick-sort greater)))))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-29 11:56:40

在设计递归算法时,有两件事是至关重要的:终止条件和递归步骤,并且没有终止条件。跟踪您的代码正在做什么:在第一次执行quick-sort时,您将调用:

代码语言:javascript
复制
(append (quick-sort (list 2)) (list 99) (quick-sort (list 9922)))

第一个quick-sort调用将依次调用(quick-sort '())。您的代码不能很好地处理空列表,因为它将始终尝试引用数组的第一个元素作为第一件事。

添加逻辑以优雅地处理空列表。

此外,使用firstrest来获取列表的第一个元素和剩余元素被认为更加实用。

票数 3
EN

Stack Overflow用户

发布于 2011-07-29 11:56:19

当输入列表为空时,您的代码缺少基本大小写。当发生这种情况时,list-ref会失败,并返回该错误。

顺便说一句,请注意,(list-ref l 0)的更好名称是(first l),类似地,(list-tail l 1)写成(rest l)更好。

(还有carcdr,但如果你是新手,你可以暂时忽略它们。)

票数 3
EN

Stack Overflow用户

发布于 2011-08-20 11:48:51

您可能已经知道这一点,但是Racket也附带了一个内置的sort函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6868426

复制
相关文章

相似问题

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