如果递归通常较慢,那么在循环迭代中使用它的技术原因是什么?
因为在某些算法中很难迭代求解。尝试以递归和迭代的方式解决深度优先搜索问题。您将得到这样一个想法,即使用迭代来解决DFS是非常困难的。
另一件值得尝试的事情是:尝试以迭代方式编写合并排序。这将花费您相当长的时间。
在任何地方使用递归都可以使用for循环,这样说对吗?
对这条线索对此有很好的答案。
如果总是有可能将递归转换为for循环,是否有经验法则可以做到这一点?
相信我。尝试编写自己的版本以迭代方式解决深度优先搜索问题。您会注意到一些问题更容易递归解决。
提示:当你在解决一个可以通过分治技术解决的问题时,递归是很好的。
在任何地方使用递归都可以使用for循环,这样说对吗?
是的,因为大多数CPU中的递归都是用循环和堆栈数据结构建模的。
如果递归通常较慢,那么使用它的技术原因是什么?
它不是“通常较慢”:较慢的是错误应用的递归。最重要的是,现代编译器擅长将一些递归转换为循环,甚至无需询问。
如果总是有可能将递归转换为for循环,是否有经验法则可以做到这一点?
为迭代解释时最容易理解的算法编写迭代程序;为递归解释最好的算法编写递归程序。
例如,在许多编程语言中搜索二叉树、运行快速排序和解析表达式通常是递归解释的。这些最好也是递归编码。另一方面,计算阶乘和计算斐波那契数在迭代方面更容易解释。对它们使用递归就像用大锤拍苍蝇:这不是一个好主意,即使大锤做得非常好。
递归通常要慢得多,因为所有函数调用都必须存储在堆栈中,以允许返回到调用方函数。在许多情况下,为了实现作用域隔离,必须分配和复制内存。
一些优化,如尾调用优化,可以使递归更快,但并不总是可能的,并且并非在所有语言中实现。
使用递归的主要原因是
当然,每个递归都可以建模为一种循环:这就是CPU最终要做的。递归本身更直接地意味着将函数调用和作用域放在堆栈中。但是,将递归算法更改为循环算法可能需要大量的工作,并降低代码的可维护性:对于每一种优化,只有在一些分析或证据表明有必要时才应该尝试。
前面几节介绍了两个可以方便地用递归与迭代实现的函数。本节要比较递归与迭代方法,介绍为什么程序员在不同情况下选择不同方法。 递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。递归与迭代都涉及重复:迭代显式使用重复结构,而递归通过重复函数调用实现重复。递归与迭代都涉及终止测试:迭代在循环条件失败时终止,递归在遇到基本情况时终止。使用计数器控制重复的迭代和递归都逐渐到达终止点:迭代一直修改计
本文向大家介绍递归与迭代之间的区别,包括了递归与迭代之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解递归和迭代之间的区别。 递归 它使用选择结构。 如果递归步骤不能将问题缩小为较小的问题,则会发生无限递归。 如果未在特定条件下进行转换,它也将变为无限递归。 此特定条件称为基本情况。 遇到无限递归时,系统崩溃。 当满足基本情况时终止。 它比迭代慢,因为它具有维护和更新堆栈的开
我有两种不同的方法,一种是用迭代法计算第n个元素的斐波那契序列,另一种是用递归法。 程序示例如下所示: 我试图找出哪种方法更快。我得出的结论是,对于较小数量的数字,递归速度更快,但随着第n个元素的值增加,递归速度变慢,迭代速度变快。以下是三个不同n的三个不同结果: 示例#1(n=10) 示例#2(n=20) 示例#3(n=30) 我真正想知道的是,为什么迭代突然变得更快,递归变得更慢。如果我错过了
我对函数式编程很陌生,尤其是下面使用的Scheme。我正在尝试使以下函数是递归的,尾递归的。基本上,该函数的作用是对两个字符串的对齐方式进行评分。当给定两个字符串作为输入时,它会比较每个“列”字符,并根据在称为 scorer 的函数中实现的评分方案(由下面的代码中的函数调用)来累积该对齐的分数。 我有一个想法,用一个帮助函数来累积分数,但我不太确定如何去做,因此我该如何让下面的函数尾递归呢?
问题内容: 我正在编写一个递归函数,其目的是迭代pList文件。我的代码是 但是当我调用函数“ HashMapper((Map)((Map)entry).keySet());”时。我有一个例外 java.util.HashMap $ HashMap条目不能转换为java.util.Map 我不知道如何调用函数以及如何将Hashmap条目转换为Map 问题答案: 入境确实不是。它是,因此您可以根据需
我在scheme中构建了一个递归函数,它将在一些输入上重复给定的函数f,n次。 我需要用尾递归构建这个函数的迭代版本,如果我正确理解尾递归,我认为我做得对。 我的问题是,这真的是迭代的吗?我相信我已经使用尾部递归正确地构建了它,但从技术上讲,它仍然将一系列操作推迟到count=0,在这里,它执行叠加的任意多个组合。