我很难确定简单递归方法的大O。我不知道当一个方法被多次调用时会发生什么。我想更具体地谈谈我的困惑领域,但目前我正试图回答一些硬件问题,为了不想作弊,我要求任何回复本文的人提出一个简单的递归方法,并对所述方法的大O进行简单解释。(最好是Java语言……我正在学习的一种语言。)
谢谢你。
你可能想参考寻找递归方法的大O的主定理。这是维基百科的文章:http://en.wikipedia.org/wiki/Master_theorem
你想把递归问题想象成一棵树。然后,考虑树的每个级别和所需的工作量。问题通常分为3类,根重(第一次迭代
以合并排序为例:
define mergeSort(list toSort):
if(length of toSort <= 1):
return toSort
list left = toSort from [0, length of toSort/2)
list right = toSort from [length of toSort/2, length of toSort)
merge(mergeSort(left), mergeSort(right))
您可以看到,每个mergeSort调用依次调用两个以上的mergeSorts,其长度为原始长度的1/2。我们知道合并过程所需的时间与被合并的值的数量成比例。
递归关系为T(n)=2*T(n/2)O(n)。这两个来自2个调用,n/2来自每个调用,每个调用的元素数只有一半。然而,在每个级别上都有相同数量的元素n需要合并,因此每个级别上的恒定功为O(n)。
我们知道工作是均匀分布的(每个深度O(n)),树是log_2(n)深,所以递归函数的大O是O(n*log(n))。
您也可以递归地定义顺序。例如,假设你有一个函数f。计算f(n)需要k步。现在要计算f(n 1)。假设f(n1)调用f(n)一次,那么f(n1)需要k个常数步。每次调用都会额外执行一些常量步骤,因此该方法是O(n)。
现在看另一个例子。假设您通过添加前面的两个结果来天真地实现斐波那契:
fib(n) = { return fib(n-1) + fib(n-2) }
现在假设可以用大约k个步骤计算fib(n-2)和fib(n-1)。要计算fib(n),需要k k=2*k步。现在假设你想计算fib(n 1)。因此,您需要两倍于fib(n-1)的步骤。这似乎是O(2^N)
诚然,这不是很正式,但希望通过这种方式你能有点感觉。
我有两个非递归方法,其中一个读取字符串中的总“e”字符,另一个检查 ArrayList 是否按字母顺序排列。 递归方法的定义是方法调用自身。我相信我理解这个概念,但要实现它或将其转换为递归方法确实很困难。我怎样才能将这些方法转化为递归方法,同时我应该如何思考?此外,这是我的另一种方法,它只打印出指定数字大小的数字。 条件方法检查数字的第一个数字(从右起)是否大于第二个数字,并再次检查第二个是否大于
我正在处理我当前的任务,即创建一个LinkedList数据结构,我已经创建了它以及其他方法,它工作得非常好。我正在处理我的最后一个问题,即制作一个toString方法。它应该: toString方法返回列表的字符串表示形式。用逗号分隔每个项目,并用大括号括住这些项目,例如{1,4,7,5}。公共toString方法必须调用私有递归方法来生成以逗号分隔的项目列表。(但您可以在公共方法中添加大括号。)
我在深度优先搜索算法实现的递归方法方面遇到了一些麻烦。这是二叉树照片: 该方法在树的右侧(55、89、144)工作得很好,但是当它来到左侧时,它返回nil,即使它输入“是”。那么,代码有什么问题呢?节点是Node类的一个实例,它具有值(整数)并链接到左右子级(Node类的其他实例),如果它没有来自该侧的子级,则为nil。 下面是方法代码:
我无法找到此练习的正确解决方案,以下是任务: (数组中指定字符的出现次数)编写一个递归方法,用于查找数组中指定字符的出现次数。您需要定义以下两种方法。第二种是递归助手方法。 公共静态int计数(char[]chars,char ch) 公共静态int计数(char[]chars, char ch, int high) 编写一个测试程序,提示用户输入一行中的字符列表和一个字符,并显示该字符在列表中的
问题内容: 您好,我正在尝试编写一种非递归方法来获取节点的大小,因为Java中的递归非常昂贵。这将包括子节点的数量+ 1(自身)。我已经转换了C实现,如何以非递归方式获取二叉树中的叶节点数量?进入Java,但这是不正确的。 编辑:非递归计算二进制树大小的算法。 问题答案: 您的算法正在计算 叶节点 。您自己的愿望是计算 所有 节点。对叶节点进行计数的算法仅在弹出叶节点时才添加到计数器,这对于Jav
问题内容: 我在使用Java中的基本递归问题时遇到了很多麻烦;任何指针都很棒。 “写一种静态递归方法来打印出几何序列的第n个项:2、6、18、54。” 据我所知,我应该在代码中的某处递归地将某物乘以3,但我一直在努力寻找方法。我知道我需要终止声明,但是何时发生?我需要帮手方法吗? 问题答案: 一个递归函数是一个函数,它的实现引用自身。以下是一些有趣的示例: 解决问题的方法: 编辑 : 上面的类使用