递归是一个有趣的编程概念,但学习起来有点棘手。递归只是指重复自身的东西。如果你想看到一个厚脸皮的递归例子,试着在Google上搜索递归。您将发现一个复活节彩蛋,其中搜索结果建议是递归的。另一方面,如果您想学习如何编写递归函数,请继续阅读!
递归函数是一个调用自身的函数。实际上,您创建了一个带有函数的循环。可以想象,这些函数很难编写。您不希望代码永远运行。
与循环类似,递归函数将由条件控制。一旦满足条件,函数就停止调用自身,从而停止循环。这就是如何创建一个调用自身而不会永远运行的函数。
尽管递归函数的作用类似于循环,但计算机执行它的方式不同。因此,一些算法在循环中效率更高,而另一些算法则受益于递归函数。但是在我们研究如何使用递归函数之前,您需要知道如何编写一个递归函数。
所有递归函数都具有相同的基本结构:
FUNCTION name IF condition THEN RETURN result ELSE CALL FUNCTION nameEND FUNCTION上面的示例是用伪代码编写的。它概述了函数的结构,可以应用于任何语言。为了简单起见,在本文中,我们将集中讨论Python。
关于递归函数,首先要注意的是,当满足条件时,函数退出递归。这意味着在编写递归函数时,首先要确定何时停止递归。
如果不满足条件,函数将调用自身。因此,如果要将信息发送到下一个循环,则必须将其作为函数中的参数发送。这可以赋予递归函数更多的功能。
相关:什么是编程中的函数?
当您看到递归的实际应用时,理解它是如何工作的就容易多了。为了演示它,让我们编写一个递归函数,返回一个数的阶乘。
阶乘返回一个数与其前所有整数的乘积。例如,5的阶乘是5×4×3×2×1或120。
def factorialFunction(numberToMultiply): if numberToMultiply == 1 : return 1 else : return numberToMultiply * factorialFunction(numberToMultiply - 1) result = factorialFunction(3)print(result)//Outputs: 6上面的程序将给出结果6,这是数字3的阶乘。一开始可能会有点混乱。如果我们一步一步地完成这个计划会有帮助的。
递归是一个棘手的概念。将其视为将一个函数堆叠在另一个函数之上可能会有所帮助。一旦一个函数被最终解析,它就可以将信息发送回堆栈,直到所有函数都有了答案。
这实际上就是你的电脑所做的。当您调用函数时,它会一直保存在内存中,直到返回为止。这意味着递归函数可以使用比循环多得多的内存。
因此,将循环编写为递归函数可能效率不高,但这是练习构造循环的好方法。您应该能够将循环编码为具有类似结果的递归函数。
此循环也可以递归编写为:
def recursiveFunction(number) : if (number % 2) == 0 : return number else: print("That number is not even. Please enter a new number:") recursiveFunction(int(input())) print("Enter and even number:")i = recursiveFunction(int(input()))第一步是确定函数何时停止。在这种情况下,我们希望它在输入偶数后停止。在我们的示例中,number跟踪用户的输入。如果他们输入一个偶数,我们就返回这个数。否则,我们将继续要求一个新号码。
为了建立循环,我们再次调用函数。但这一次,我们传递给下一个函数的数字是用户输入的新数字。下一个函数调用将检查号码。
这是一个非常糟糕的函数!是的,它正在检查数字是否是偶数,就像我们的循环一样,但它不是有效的。每次用户输入一个奇数时,该函数都保存在内存中,并调用一个新函数。如果你这样做的次数足够多,你的内存就会用完!
相关:帮助您快速学习的基本Python示例
上面的例子是不使用递归的好例子。那么,递归在哪里使用?搜索二叉树就是一个很好的例子。
当数据在二叉树中结构化时,您必须沿着许多路径来搜索数据。在树中的每个点上,您都必须决定是要继续从右侧还是左侧进行搜索。您可以将访问的树的哪一部分保存在变量中,但是递归函数可以自然地跟踪该信息。
想象一下,我们正在上面的树上寻找数字6。我们可以做一个递归函数,从左到右搜索树。算法如下所示:
FUNCTION searchTree(branchToSearch) IF find 6 OR end of tree THEN RETURN result ELSE PROCESS branch CALL FUNCTION searchTree(left) CALL FUNCTION searchTree(right)END FUNCTION在这个伪代码示例中,算法将首先搜索树的左侧。每次访问一个新号码时,该功能都会暂停并保存在内存中。这使我们能够追踪我们去过的地方。
该算法总是首先尽可能地搜索左侧。一旦到达树的末尾,searchTree(左)将完成,它将检查右侧。一旦两边都被选中,搜索将备份一个分支并继续检查右侧。
如果算法搜索整棵树,它会按以下顺序进行:
2、7、2、6、5、11、5、9和4
看看是否可以使用上面的伪代码。
递归是一个高级的主题。它需要一些时间来理解,甚至更长的时间来获得良好的编码。如果您一步一步地遍历递归函数,这会有所帮助。在学习表示每个函数调用时,在遍历函数的过程中堆叠索引卡或张贴注释可能会有所帮助。
在编写递归函数时,首先要确定如何退出该函数。接下来,确定如何设置循环。确定哪些信息需要发送到下一个函数调用,哪些信息需要返回。
学习递归的最好方法是练习它并从错误中学习。看看您的一些旧代码,并挑战自己将循环重新编写为递归函数。这可能不会提高代码的效率,但这将是一个很好的实践。
...建软件应用程序的主要技术。 目录 1. 概述和主要区别 2. 什么是递归 3. 什么是迭代 4. 递归与迭代的相似性 5. 并排比较-递归与表格形式的迭代 6. 摘要 什么是递归(recursion)? 当函数在函数内调用自身时,称为递归。递归有两种类...
... -R:递归列出子目录。 -X:按文件扩展名的字母顺序排序。 -d:只列出目录,不列出目录的内容。 ...
... 最终,你的浏览历史是帮助大公司赚钱。这就是为什么你应该总是使用第三方DNS提供商。 ...
...1974年,现在仍然很强大,因为我们需要它所做的,没有什么比它做得更好。 把grep和一些正则表达式耦合起来,真的把它带到了一个新的层次。 相关:如何使用基本正则表达式更好地搜索和节省时间
...常用于开发由web服务器上的PHP引擎处理的web应用程序。 什么是php文件(a php file)? PHP是由Ra**usLerdorf在1994年创建的,它是用C编程语言编写的一组简单的脚本。它的主要目的是跟踪浏览过他的在线简历的访问者。他最初将这些脚...
...认情况下,ls列出当前目录中的文件。 您还可以使用ls-R递归地列出文件,即列出当前目录中目录中的所有文件。 如果指定目录,ls还可以列出另一个目录中的文件。例如,ls/home将列出/home目录中的所有文件。 cd–更改目录 cd命...
...织或分类,那么在字典里搜索单词是多么困难。这就是为什么字典里的词条是按标准的字母顺序排列的。通过排序,许多任务和计算变得毫不费力。这就是排序算法的用武之地。 排序算法只不过是一种将列表中的元素按特定顺...
...组织运行自己的公共递归DNS服务器。 覆盖的关键领域 1.什么是DNS–定义,功能2.什么是权威DNS服务器–定义,功能3.什么是递归DNS服务器–定义,功能4.权威DNS和递归DNS之间的区别是什么–主要区别的比较 关键术语 权威DNS,DNS,...
...术都有助于开发小型到复杂的程序。 覆盖的关键领域 1.什么是递归-定义,功能2.什么是循环-定义,功能3.递归和循环的区别是什么-关键区别的比较 关键术语 执行While循环,For循环,循环,递归,While循环 什么是递归(recursion)?...