如何确定球拍中的列表是升序还是降序

时间:2019-07-02 03:24:53

标签: string list recursion racket

我需要创建一个函数来识别列表是按升序还是降序。如果列表按升序排列,则该函数将输出“升序”;如果该列表按降序排列,则该函数将输出“降序”;如果该列表既不是递增也不是减小,则列表输出为“混合”。

到目前为止,这是我的代码,显然它不起作用。我仍然对在Racket中进行递归还不陌生,所以我很确定这不是您正确执行递归的方式。我已经看到了确定列表是否按升序排列的解决方案,但是这些解决方案无济于事,因为在这里,我还必须检查3种不同的情况,包括基本情况。

def count(request):
        fulltext = request.GET['fulltext']


        #Deletes empty spaces in fulltext and save it as wordlist
        wordlist = fulltext.split()

        #Declare an empty list
        worddictionary = {}

        #For each word in wordlist, if exist in list add 1, if not, add it to list
        for word in wordlist:
            word = word.lower()
            if word in worddictionary:
                worddictionary[word] += 1
            else:
                worddictionary[word] = 1

        #Sort list from highest occurence to least
        sortedwords = sorted(worddictionary.items(), key=operator.itemgetter(1), reverse=True)

fulltext = request.GET['fulltext']
return render(request, 'count.html', {'fulltext': fulltext})

这是显示3种不同情况的3个示例。

(define (order? L)
  (cond
    [(empty? L) '()]
    [(> (first L) (first (rest L)))
     (order? (rest L)) "descending"]
    [(< (first L) (first (rest L)))
    (order? (rest L)) "ascending"]
    [else ("mixed")]))

1 个答案:

答案 0 :(得分:1)

实际上,对于此问题,您不需要使用递归。 <=>=运算符就足够了(<>不够,如果有重复的元素,它们会失败):

(define (order? lst)
  (cond ((apply >= lst)  "ascending")
        ((apply <= lst) "descending")
        (else                "mixed")))

以上方法之所以有效,是因为<=>=接受多个参数,并且要测试列表是否按升序排列,我们只需要查看是否为真即可。

(<= 2 4 6 8)
=> #t

对于下降的情况类似。我们使用apply将列表作为参数传递给支持可变数量参数的运算符。它按预期工作:

(order? (list 2 4 6 8))
=> "ascending"
(order? (list 2 8 4 1 9 10 2))
=> "mixed"
(order? (list 9 8 7 6 3 2))
=> "descending"

要使用递归解决问题,您基本上必须在每个元素和下一个元素上应用<=>=,如果找到false条件,则停止。

您应该编写两个帮助程序,一个用于测试列表是否是升序的,另一个用于测试列表是否是后代的。

尝试的解决方案的主要概念问题是您没有在正确的时机停下来,并且基本情况是错误的-它应该在您的两个助手中的每一个上返回true