Recursion 无限递归格式

Recursion 无限递归格式,recursion,scheme,racket,Recursion,Scheme,Racket,我正在编写自己版本的quicksort,某种原因导致了我无法追踪的无限递归 (define (quicksort-test list) (cond ((null? list) '()) (else (appending (quicksort-test (less-than-builder list (car list))) (quicksort-test (geq-builder list (car list))))))) Appe

我正在编写自己版本的quicksort,某种原因导致了我无法追踪的无限递归

(define (quicksort-test list)
  (cond
    ((null? list) '())
    (else
     (appending (quicksort-test (less-than-builder list (car list)))
                (quicksort-test (geq-builder list (car list)))))))

Appending是一个助手函数,它只是将一个列表追加到另一个列表上,而less-by-builder和geq-builder是助手函数,它们将列表和轴作为输入,然后分别构建一个小于轴的列表和大于或等于轴的列表。我认为问题出在我的else语句中,尽管我不明白为什么会这样,可能是因为大脑被炸了。

为大于或等于pivot元素的每个元素建立一个列表永远不会返回空列表,它只会深入到单个元素,并不断地反复调用自己,因为包含单个元素的列表总是大于或等于自身

你需要删除枢轴元素——在<代码>(CDR列表)递归,然后把它放回中间。< /P>


molbdnilo和Eddie V在评论中解决了这个问题,这要归功于他们

实际上,我刚才输入了我的问题,我想我可能已经看到了这个问题。我想问题是我的最后一句话。构建一个大于或等于pivot元素的每个元素的列表不会返回一个空列表,是吗?它只会深入到单个元素,并不断地反复调用自己,因为包含单个元素的列表总是大于或等于自身。。。是吗?是的。你需要移除枢轴元素——在<代码>(CDR列表)递归,然后把它放回中间。另外,不要对变量使用名称
list
,因为它隐藏了
list
过程。哦,好的调用。在这种情况下,把它列出来似乎没有什么坏处,但我想这仍然是一种不好的做法。在(cdr列表)上递归比我做的更有意义。。。真不敢相信我居然没想到。最后,我修改了helper函数,只输出大于轴的元素,并添加了另一个helper函数来检索与轴相等的所有元素,并在另一个生成器步骤中添加它们。它似乎工作得很好,但比你建议的要差得多。