1
16
每次递归调用函数时,它都会有效地复制所需的信息,然后继续。 你可以有一个“无限地”重复出现的程序,也就是说,直到它耗尽了资源,通常堆栈空间这些副本将要进入的空间。看起来像是
显然,这并不是很有用,所以您需要编写一个对重复频率有一定限制的程序。下面是一个非常简单的程序,它可以管理:
如果编译并运行它,请使用以下命令:
你会得到结果:
看看它是如何被调用的,10,9,等等,然后在它到达底部之后,它显示它返回1,然后2,等等,回到10?
基本规则是
每一个
递归函数应该有一个基本情况,即
做
再给自己打电话。在这个例子中,基本情况是
随着数学的发展,您将看到许多这种类型的递归定义。 这里有一个稍微漂亮的C版本,输出更好:
输出:
|
2
2
查字典: 递归 名词。看见 递归 现在,严肃地说,在上面的笑话中,递归的定义是根据递归本身给出的。这是递归。 递归算法是一种基于算法本身实现的算法。开发这种算法的过程从最基本的情况开始,这些情况的解决方案要么是预先知道的,要么是可以简单计算的。然后你用它本身来定义算法。
作为一个简单的例子,计算一个给定整数的n次幂,我可以是一个函数。
我们已经根据函数本身定义了函数。从最基本的情况开始(n^0=1)。如果我们不是在最简单的情况下,您可以用自己的方式表达您的算法。
程序将通过调用
实际调用跟踪将是:
在开发递归算法的过程中,它通常帮助我相信我已经启动并运行了该算法,并且只处理新结果的简化/组合。 |
3
2
递归可以理解为归纳原理的一个实际应用。为了证明一个语句p(n)对于所有n,其中p(n)表示“从1到n的整数之和是n(n+1)/2”,我们必须证明两件事:
类似地,在类似mergesort的递归函数中,我们需要处理两种情况:
关键是这两个数组 更小的 而不是原来的,否则他们中的一个永远不会击中基本情况。因为数组被分割成大约一半,所以在这种情况下,递归的深度大约是log2(n)。 就问题中的代码而言,有三个问题:
新程序员应该尝试用纸和铅笔运行mergesort。 |
4
0
如果递归函数不是无限的,则需要有某种条件,在这种情况下,它返回而不调用自身。对于某些算法来说,这种情况是对数据执行调用不再有意义的时候。 在您的例子中,如果您拆分传入的向量,最终得到两个向量,每个向量只包含一个项,那么对它们调用mergesort()是否有意义?不。 您可以通过检查farray和sarray的大小来处理这个问题,并在组合它们并返回组合之前决定是对两者之一调用mergesort()。 如果一个有两个项目,一个有一个项目怎么办?对大小2调用mergesort(),但对大小1不调用mergesort()。 如果调用mergeSort()在返回之前未对farray或sarray调用mergeSort(),则递归将开始展开。 |
5
0
看看维基百科网页 merge sort 有关您正在尝试执行的操作的其他信息。 作为旁注,请注意您正在复制作为参数给定的每个向量。使用vector<>const&代替。 |
jkfe · 为什么println会在这段递归代码中执行? 2 年前 |
Jimmy · 这种算法怎么能按顺序遍历树“爬上”树呢? 2 年前 |
AvirukBasak · gcc中无return语句的尾部递归 2 年前 |
Dharmik Patel · 使用python递归完全可以整除 2 年前 |
W.tan · 一维最短距离递归算法 2 年前 |
ncarrawa · 将1添加到i(递归)时出现类型错误 2 年前 |
Eren · Python递归何时返回[duplicate] 2 年前 |