我在撰写计划时遇到了很多麻烦......
我正在尝试使用scheme编写quicksort。我已经看到了大量的答案,但它们对我来说并没有任何意义,这主要是因为我根本不了解函数式编程。
我已经定义了我的支点:
(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(&lt;(car lis)pivot)append lis1)(partition(append lis2)))))
我不确定如何做到这一点,关于如何使这项工作的任何想法?或者我的理由是什么?
答案 0 :(得分: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)))))
你需要定义另一个功能来完成这项工作。因为你需要另外两个参数来保存较小和较大数字的列表。这是一种方法。还有其他更短的输入方式。但我想要明确。