【问题标题】:Writing partition for quicksort in scheme为方案中的快速排序写入分区
【发布时间】:2014-11-13 02:45:26
【问题描述】:

我在编写方案时遇到了很多麻烦......

我正在尝试使用方案编写快速排序。我看过很多答案,但它们对我来说没有任何意义,这主要是因为我几乎不了解函数式编程。

我已经这样定义了我的支点:

(define (pivot lis)
  (car lis))

这很好用(而且很容易编写..)

根据我对分区函数的理解,您拥有原始列表,然后将其拆分为 2 个新列表,一个包含大于枢轴的值,另一个包含小于或等于枢轴的值。

这就是我尝试实现它的方式:

(define (partition lis)
  (if (null? lis) '())
  (else (lambda (lis1 lis2)
          (if (< (car lis) pivot) append lis1)
          (partition (append lis2)))))

这是我得到的错误: . else: 不允许作为表达式: (else (lambda (lis1 lis2) (if (

我不太确定如何做到这一点,有什么想法可以做到这一点吗?还是我的推理不对?

【问题讨论】:

  • 如错误所说:else 不能单独使用,它必须从 cond 表达式的最后一个子句开始。

标签: scheme quicksort


【解决方案1】:
(define (partition ls)
  (partition-aux ls (pivot ls) '() '()))

(define (parition-aux ls pivot smaller larger)
  (cond
    ((empty? ls) (list smaller larger))
    ((< (car ls) pivot)
     (parition-aux (cdr ls) pivot (cons (car ls) smaller) larger))
    (else
     (partition-aux (cdr ls) pivot smaller (cons (car ls) larger)))))

您需要定义另一个函数来完成这项工作。因为您还需要 2 个参数来保存更小和更大数字的列表。这是一种方法。还有其他更短的输入方式。但我想明确一点。

【讨论】:

  • 谢谢!我真的只是认为我可以在 lambda 中完成所有操作。此外,显然我对方案的基本理解还很遥远,需要更多的练习。感谢您花时间向我展示。
  • 可以使用 lambdas 进行递归过程。但它很难理解。定义辅助函数的最常见方法是使用命名的 let。你可以阅读它。我只是认为单独的功能会更清晰。
  • 你也可以使用内部定义来定义你的辅助函数。对于初学者,这是我通常建议的。当然,就像你说的,经验丰富的计划者更喜欢命名为 let
猜你喜欢
  • 2022-07-01
  • 2018-10-24
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 2018-09-13
  • 2021-06-11
相关资源
最近更新 更多