什么是递归?如何使用它?

学习递归的基础知识,这是程序员必备的但有点费心的工具。...

递归是一个有趣的编程概念,但学习起来有点棘手。递归只是指重复自身的东西。如果你想看到一个厚脸皮的递归例子,试着在Google上搜索递归。您将发现一个复活节彩蛋,其中搜索结果建议是递归的。另一方面,如果您想学习如何编写递归函数,请继续阅读!

recursive function

什么是递归函数(a recursive function)?

递归函数是一个调用自身的函数。实际上,您创建了一个带有函数的循环。可以想象,这些函数很难编写。您不希望代码永远运行。

与循环类似,递归函数将由条件控制。一旦满足条件,函数就停止调用自身,从而停止循环。这就是如何创建一个调用自身而不会永远运行的函数。

尽管递归函数的作用类似于循环,但计算机执行它的方式不同。因此,一些算法在循环中效率更高,而另一些算法则受益于递归函数。但是在我们研究如何使用递归函数之前,您需要知道如何编写一个递归函数。

如何编写递归函数

所有递归函数都具有相同的基本结构:

FUNCTION name IF condition THEN RETURN result ELSE CALL FUNCTION nameEND FUNCTION

上面的示例是用伪代码编写的。它概述了函数的结构,可以应用于任何语言。为了简单起见,在本文中,我们将集中讨论Python。

关于递归函数,首先要注意的是,当满足条件时,函数退出递归。这意味着在编写递归函数时,首先要确定何时停止递归。

如果不满足条件,函数将调用自身。因此,如果要将信息发送到下一个循环,则必须将其作为函数中的参数发送。这可以赋予递归函数更多的功能。

相关:什么是编程中的函数?

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的阶乘。一开始可能会有点混乱。如果我们一步一步地完成这个计划会有帮助的。

  1. 调用函数时,numberToMultiply等于3。
  2. 条件不满足,所以我们进入else条件。
  3. 我们的函数返回3*,但随后暂停。它必须调用自身来确定它返回的值的其余部分。
  4. 这次调用函数时,numberToMultiply的值等于2。
  5. 条件不满足,所以我们进入else条件。
  6. 我们的函数返回2*,但随后暂停。它必须调用自身来确定它返回的值的其余部分。
  7. 再次调用该函数。这一次,numberToMultiply的值等于1。
  8. 如果符合我们的条件。函数返回1。
  9. 步骤6中的函数现在可以将2*1返回到步骤3中的函数。
  10. 第三步的函数现在可以返回3*2*1,也就是6。

recursive algorithm

递归是一个棘手的概念。将其视为将一个函数堆叠在另一个函数之上可能会有所帮助。一旦一个函数被最终解析,它就可以将信息发送回堆栈,直到所有函数都有了答案。

这实际上就是你的电脑所做的。当您调用函数时,它会一直保存在内存中,直到返回为止。这意味着递归函数可以使用比循环多得多的内存。

因此,将循环编写为递归函数可能效率不高,但这是练习构造循环的好方法。您应该能够将循环编码为具有类似结果的递归函数。

如何将循环转换为递归函数的示例

print("Enter an even number:")i = int(input())while (i % 2) != 0 : print("That number is not even. Please enter a new number:") i = int(input())

此循环也可以递归编写为:

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示例

递归函数的真实示例

上面的例子是不使用递归的好例子。那么,递归在哪里使用?搜索二叉树就是一个很好的例子。

Binary Tree

当数据在二叉树中结构化时,您必须沿着许多路径来搜索数据。在树中的每个点上,您都必须决定是要继续从右侧还是左侧进行搜索。您可以将访问的树的哪一部分保存在变量中,但是递归函数可以自然地跟踪该信息。

想象一下,我们正在上面的树上寻找数字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

看看是否可以使用上面的伪代码。

递归综述

递归是一个高级的主题。它需要一些时间来理解,甚至更长的时间来获得良好的编码。如果您一步一步地遍历递归函数,这会有所帮助。在学习表示每个函数调用时,在遍历函数的过程中堆叠索引卡或张贴注释可能会有所帮助。

在编写递归函数时,首先要确定如何退出该函数。接下来,确定如何设置循环。确定哪些信息需要发送到下一个函数调用,哪些信息需要返回。

学习递归的最好方法是练习它并从错误中学习。看看您的一些旧代码,并挑战自己将循环重新编写为递归函数。这可能不会提高代码的效率,但这将是一个很好的实践。

  • 发表于 2021-03-29 05:32
  • 阅读 ( 227 )
  • 分类:编程

你可能感兴趣的文章

递归(recursion)和迭代(iteration)的区别

...建软件应用程序的主要技术。 目录 1. 概述和主要区别 2. 什么是递归 3. 什么是迭代 4. 递归与迭代的相似性 5. 并排比较-递归与表格形式的迭代 6. 摘要 什么是递归(recursion)? 当函数在函数内调用自身时,称为递归。递归有两种类...

  • 发布于 2020-10-19 23:58
  • 阅读 ( 276 )

如何在linux和macos上将手册页缩短为可读的解释

... -R:递归列出子目录。 -X:按文件扩展名的字母顺序排序。 -d:只列出目录,不列出目录的内容。 ...

  • 发布于 2021-03-14 01:21
  • 阅读 ( 192 )

cloudflare dns如何帮助解决4大dns隐私风险

... 最终,你的浏览历史是帮助大公司赚钱。这就是为什么你应该总是使用第三方DNS提供商。 ...

  • 发布于 2021-03-20 09:08
  • 阅读 ( 278 )

动态规划:示例、常见问题和解决方案

... 什么是动态规划(dynamic programming)? ...

  • 发布于 2021-03-27 03:54
  • 阅读 ( 196 )

如何在linux上使用grep命令

...1974年,现在仍然很强大,因为我们需要它所做的,没有什么比它做得更好。 把grep和一些正则表达式耦合起来,真的把它带到了一个新的层次。 相关:如何使用基本正则表达式更好地搜索和节省时间

  • 发布于 2021-04-02 17:23
  • 阅读 ( 165 )

什么是php文件(如何打开一个)?

...常用于开发由web服务器上的PHP引擎处理的web应用程序。 什么是php文件(a php file)? PHP是由Ra**usLerdorf在1994年创建的,它是用C编程语言编写的一组简单的脚本。它的主要目的是跟踪浏览过他的在线简历的访问者。他最初将这些脚...

  • 发布于 2021-04-04 08:47
  • 阅读 ( 263 )

如何从linux终端管理文件:您需要知道的11个命令

...认情况下,ls列出当前目录中的文件。 您还可以使用ls-R递归地列出文件,即列出当前目录中目录中的所有文件。 如果指定目录,ls还可以列出另一个目录中的文件。例如,ls/home将列出/home目录中的所有文件。 cd–更改目录 cd命...

  • 发布于 2021-04-10 05:26
  • 阅读 ( 129 )

快速排序(quick sort)和合并排序(merge sort)的区别

...织或分类,那么在字典里搜索单词是多么困难。这就是为什么字典里的词条是按标准的字母顺序排列的。通过排序,许多任务和计算变得毫不费力。这就是排序算法的用武之地。 排序算法只不过是一种将列表中的元素按特定顺...

  • 发布于 2021-06-25 22:32
  • 阅读 ( 443 )

权威(authoritative)和递归dns(recursive dns)的区别

...组织运行自己的公共递归DNS服务器。 覆盖的关键领域 1.什么是DNS–定义,功能2.什么是权威DNS服务器–定义,功能3.什么是递归DNS服务器–定义,功能4.权威DNS和递归DNS之间的区别是什么–主要区别的比较 关键术语 权威DNS,DNS,...

  • 发布于 2021-07-01 03:14
  • 阅读 ( 806 )

递归(recursion)和环(loop)的区别

...术都有助于开发小型到复杂的程序。 覆盖的关键领域 1.什么是递归-定义,功能2.什么是循环-定义,功能3.递归和循环的区别是什么-关键区别的比较 关键术语 执行While循环,For循环,循环,递归,While循环 什么是递归(recursion)?...

  • 发布于 2021-07-01 05:19
  • 阅读 ( 290 )
dingkaoqian9953
dingkaoqian9953

0 篇文章

相关推荐