递归

欢迎回到Digilent博客!今天我们来复习一下递归!递归当函数直接或通过另一个函数调用自身时。有时我们不能用循环(迭代)来解决问题,所以我们必须使用递归。递归比迭代慢,难于调试,并且它占用更多的堆栈。但是递归也可以有更简单的代码,所以在某些情况下,好处大于问题。

递归函数有两个部分基地情况下,递归调用。的基地情况是将函数化简为最基本的情况,然后返回。的递归当我们再次调用递归函数时。这读起来很混乱,所以最好的方式是用代码来显示它。当我们调用递归语句时,我们的函数正在将另一个参数输入减少(否则函数将永远不会结束)的自身调用推到堆栈上,当我们到达基本情况并开始返回时,这些调用将弹出。

的阶乘
让我们看看第一个函数的阶乘的阶乘是模拟“啊!”运营商数学。我们的参数和返回值都是一个整数,参数名为“n”。我们首先看到的是基本情况。如果n <= 1 (n不应该是0或更小,但为了以防万一,我们有“<”符号),那么我们返回1。

其次,我们有递归步骤,也就是我们在return语句中再次调用factorial。让我们用n等于4的例子,或者递归调用是返回* factorial (3) (4), (n-1)是约化。因为作为参数传递的“n”不是我们的基本情况,所以我们将执行另一个递归调用,但这一次是返回* factorial (2) (3)

斐波那契
另一个递归的好例子是斐波那契数列。斐波那契数列是前两道主菜的和,直到“n”。这里的新情况是我们有两种可能发生的基本情况,因为我们的斐波那契使用前两个号码,意味着它必须呼叫斐波那契每次递归调用两次。每一次呼叫斐波那契另外两次调用斐波那契到堆栈上,这样您就可以看到递归如何潜在地导致堆栈问题!

主要
所有递归代码
下面是一个小的主函数,让用户输入一个值。对于本例,我们将用户的输入值限制在0到19之间。这是因为阶乘函数是20!beyond大于int的大小(查看原因)这里!).

0
第一个投票。

对乔希

我爱编码!

查看所有帖子由Josh→

留下一个回复

您的电子邮件地址将不会被公布。必填字段被标记