当前位置: 首页 > 知识库问答 >
问题:

如何使用递归找到最大长度的列表?

百里渊
2023-03-14

我正在尝试使用递归函数打印列表,该列表具有由我的以下代码产生的列表的最大长度:

allincreasing :: Ord a => [a] -> [[a]]
allincreasing =  map nub  . filter isSorted . subsequences

main = do
print $ allincreasing[3,2,6,4,5,1]

我需要将下面的输出传递给找到最大长度的递归函数:

[[],[3],[2],[6],[3,6],[2,6],[4],[3,4],[2,4],[5],[3,5],[2,5],[4,5],[3,4,5],[2,4,5],[1]]

基于我对这个问题答案的理解,我尝试使用以下代码来实现它,但我无法很好地实现递归部分。以下是我的尝试:

 longest :: Ord a => [[a]] -> [a]
 longest [y] = y    --base case: if there's only one element left, return it.
 longest (x:y:lst) --extract the first two elements x, y from the list.  
   | length x < length y = longest (y:lst)
   | otherwise  = x : (longest (y:lst))


  lis :: Ord a => [a]  -> a 
  lis = length . longest . allincreasing

注:我需要使用递归来解决最长递增序列的问题。

共有1个答案

柳正志
2023-03-14

当您想跟踪存根以及递归时(就像到目前为止的最大列表一样...)可以使用累加器(您可以在此处阅读有关它们的信息...):

由于评论请求而编辑:

module Main where
import Data.List

isSorted :: (Ord a) => [a] -> Bool
isSorted []       = True
isSorted [x]      = True
isSorted (x:y:xs) = x <= y && isSorted (y:xs)

allincreasing :: Ord a => [a] -> [[a]]
allincreasing =  map nub  . filter isSorted . subsequences

main :: IO ()
main = do

   
    let list = [3,2,6,4,5,1]
    print $ allincreasing list
    print $  longest $ allincreasing list



longest :: Ord a => [[a]] -> [a]
longest list = longest' list [] 
    where
        longest' [] acc = acc
        longest' (x:xs) [] = longest' xs x
        longest' (x:xs) acc 
            | length acc >= length x = longest' xs acc
            | length acc < length x = longest' xs x
        longest' _ _ = error "something went wrong..."
 类似资料:
  • 问题内容: 背景:我正在使用最小构造算法构建一个Trie以表示字典。输入列表是430万个utf-8字符串,按字典顺序排序。生成的图是非循环的,最大深度为638个节点。我的脚本的第一行通过将递归限制设置为1100 。 问题:我希望能够将Trie序列化到磁盘上,因此我可以将其加载到内存中,而不必从头开始重建(大约22分钟)。我已经尝试了和,同时使用了文本和二进制协议。每次,我都会得到如下所示的堆栈跟踪

  • 当我尝试对BigInteger使用MAX_VALUE时,它给出>>ERROR>>找不到符号变量MAX_VALUE

  • 问题内容: 我正在使用Hornetq 2.0,我不知道如何知道当前队列中有多少条消息。 这是一项非常有用的功能,因此我可以在运行时知道我的使用者是否足够快地使用了消息。 我没有使用JMS api,而是使用高度优化的核心API。 什么是获取队列中消息数量的正确(最快)方法? 我找到了两种方法,但不知道正确的方法是什么。 要么 问题答案: 我找到了两种方法 和

  • 问题内容: 为了估计在给定内存量下递归方法可能实现的最大调用深度,在可能发生堆栈溢出错误之前,用于计算所用内存的(近似)公式是什么? 编辑: 许多人以“取决于”来回答,这是合理的,因此让我们通过一个简单但具体的示例来删除一些变量: 很容易看出,在我的Eclipse IDE中运行该命令时爆炸的次数不到1000(对我来说这很低)。是否可以在不执行此调用深度限制的情况下进行估算? 编辑:我不禁想到Ecl

  • 为了估计递归方法在给定内存量下可能达到的最大调用深度,在可能发生堆栈溢出错误之前,计算所用内存的(近似)公式是什么? 许多人回答说“视情况而定”,这是合理的,所以让我们用一个琐碎但具体的例子来删除一些变量: 很容易看出,在我的EclipseIDE中运行它时,的爆炸性增长不到1000(对我来说,这个数字低得出奇)。这个调用深度限制是否可以在不执行的情况下进行估计? 编辑:我忍不住认为Eclipse有