我需要创建一个函数来识别列表是按升序还是降序。如果列表按升序排列,则该函数将输出“升序”;如果该列表按降序排列,则该函数将输出“降序”;如果该列表既不是递增也不是减小,则列表输出为“混合”。
到目前为止,这是我的代码,显然它不起作用。我仍然对在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")]))
答案 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
。