- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图理解这个递归。我知道阶乘函数中的递归是如何工作的,但是当涉及到像这样的复杂递归时,我很困惑。对我来说最令人困惑的部分是这段代码
str.split('').map( (char, i) =>
permutations( str.substr(0, i) + str.substr(i + 1) )map( p => char + p))
首先,对于 "abc"
,它将分为 ["a","b","c"]
并遍历 map
函数,然后通过第二个 map
函数将每个返回值包装为 a
、b
、c
,分别。但是,我对递归部分感到非常困惑。
我认为 "a"
中 str
值为 "abc"
的第一次递归将返回 "bc"
,而 str
值为 "bc"
的第二次递归将返回 "c"
,依此类推。
但是当我刚刚运行此代码以查看清晰的递归时,它返回
[ [ [ 'c' ], [ 'b' ] ], [ [ 'c' ], [ 'a' ] ], [ [ 'b' ], [ 'a' ] ] ]
这对我来说是最令人困惑的。我只是看不出这个递归如何返回这些值。谁能更详细地说明其工作原理,例如逐步说明您的思维过程?
我是一个视觉学习者。感谢您的帮助。
function permutations(str) {
return (str.length <= 1) ? [str] :
// Array.from(new Set(
str.split('')
.map( (char, i) =>
permutations( str.substr(0, i) + str.substr(i + 1))
.map( p => char + p))
// .reduce( (r, x) => r.concat(x), [])
// ));
}
permutations('abc')
最佳答案
我更喜欢分析和创建递归解决方案的一种方法是像数学归纳一样工作1。
诀窍是表明该函数为我们的基本情况返回正确的值,然后表明如果它为我们更简单的情况返回正确的值,它也将为我们当前的情况返回正确的值。然后我们知道它适用于所有值,只要每个递归调用都是针对一些最终导致基本情况的更简单的情况。
所以看看你的函数。我重新格式化了它以使讨论更容易,并且我恢复了 reduce
调用你已经注释掉了。事实证明,这是正确执行此操作所必需的(尽管我们将在下面讨论更现代的替代方案。)您还注释掉了 Array .from (new Set( ... ))
包装器,用于在字符串包含重复字符的情况下删除重复项。如果没有这个,"aba"
返回["aba", "aab", "baa", "baa", "aab", "aba"]
。有了它,我们得到["aba", "aab", "baa"]
,这更有意义。但这与我们的递归问题不同。
清理后的函数如下所示:
function permutations (str) {
return (str .length <= 1)
? [str]
: str
.split ('')
.map ((char, i) =>
permutations (str .substr (0, i) + str.substr (i + 1))
.map (p => char + p)
)
.reduce ((r, x) => r .concat (x), [])
}
permutations('abc')
我们的基本情况非常简单,str.length <= 1
。在这种情况下,我们得到 [str]
。这只有两种可能:字符串为空,我们返回 ['']
,或者字符串只有一个字符,例如 'x'
,我们返回 ['x']
。这些显然是正确的,因此我们继续进行递归调用。
假设我们通过了 'abc'
。 split
和map
调用将其转换为等价的:
[
permutations ('bc') .map (p => 'a' + p),
permutations ('ac') .map (p => 'b' + p),
permutations ('ab') .map (p => 'c' + p),
]
但是我们假设我们的递归适用于 'bc'
的较小字符串。 , 'ac'
,和'ab'
。这意味着permutations('bc')
将产生['bc', 'cb']
,其他的也类似,所以这相当于
[
['bc', 'cb'] .map (p => 'a' + p),
['ac', 'ca'] .map (p => 'b' + p),
['ab', 'ba'] .map (p => 'c' + p),
]
这是
[
['abc', 'acb']
['bac', 'bca']
['cab', 'cba']
]
现在我们做reduce
调用,它将每个数组连续连接到前一个结果,从 []
开始,得到
['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
有一种更简洁的方法可以做到这一点。我们可以替换map
调用后跟此 reduce
调用单flatMap
调用,如下所示:
function permutations (str) {
return (str .length <= 1)
? [str]
: str
.split ('')
.flatMap ((char, i) =>
permutations (str .substr (0, i) + str.substr (i + 1))
.map (p => char + p)
)
}
无论如何,我们已经展示了我们的归纳技巧。通过假设这适用于更简单的情况,我们表明它适用于当前的情况。 (不,我们还没有严格地做到这一点,只是通过示例,但是用某种数学严谨性来证明这一点并不是非常困难。)当我们将其与它适用于基本情况的演示结合起来时,我们证明它适用于所有情况。这取决于我们的递归调用在某种程度上更简单,最终导致基本情况。在这里,传递给递归调用的字符串比我们提供的字符串短一个字符,因此我们知道最终我们将达到str .length <= 1
。健康)状况。因此我们知道它是有效的。
如果添加 Array .from (new Set ( ... ))
包装器重新打开,这也适用于具有重复字符的情况。
1您可能遇到过归纳法,也可能没有遇到过,您可能记得也可能不记得,但从本质上讲,它非常简单。这是一个非常简单的数学归纳论证:
We will prove that
1 + 2 + 3 + ... + n == n * (n + 1) / 2
, for all positive integers,n
.First, we can easily see that it's true when
n
is1
:1 = 1 * (1 + 1) / 2
Next we assume that the statement is true for all integers below
n
.We show that it's true for
n
like this:
1 + 2 + 3 + ... + n
is the same as1 + 2 + 3 + ... + (n - 1) + n
, which is(1 + 2 + 3 + ... (n - 1)) + n
. But we know that the statement is true forn - 1
(since we assumed it's true for all integers belown
), so1 + 2 + 3 + ... + (n - 1)
is, by substituting inn - 1
forn
in the expression above, equal to(n - 1) * ((n - 1) + 1) / 2
, which simplifies to(n - 1) * n / 2
. So now our larger expression ((1 + 2 + 3 + ... (n - 1)) + n
is the same as((n - 1) * n / 2) + n
, which we can simplify to(n^2 - n) / 2 + n
and then to(n^2 - n + (2 * n)) / 2
and to(n^2 + n) / 2
. which factors inton * (n + 1) / 2
.So, by assuming it's true for everything less than
n
we show that it's true forn
as well. Together with the fact that it's true whenn
is1
, the principle of induction says that it's true for all positive integersn
.You may have seen induction stated slightly differently: If (a) it's true for
1
and (b) being true forn - 1
implies that it's true forn
, then (c) it's true for all positive integersn
. (The difference here is that we don't need the assumption that it's true for all integers belown
, only forn - 1
.) It's easy to prove the equivalence of these two models. And theeverything below
formulation usually makes for a more convenient analogy in recursive problems.
关于javascript - 这个复杂的递归代码是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65601127/
我之前发布过question已得到答复,但我也需要对此进行查询。我有一个包含这样数据的表结构(日期格式为 dd/mm/yyyy)。 ID Account Number Unit Ad
我正在使用 React Native Calendars 并尝试为议程组件构建我的数据。 预期的数据结构是(一个对象) { '2012-05-22': [{text: 'item 1 - any j
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
两列城镇和优先级。 我需要对表进行排序,以便优先级=1的城镇排在第一位,并且不按名称 ASC 排序,而其余城镇则按名称 ASC 排序。 我该怎么做? 谢谢;) 更新 SELECT * FROM map
我有三个表“Hardware_model”、“Warehouse”和“Brand”,并且表以这种方式一起引用:Hardware_model 仓库Hardware_model 品牌 现在我要执行以下
我有一个 MySQL 表 (tbl_filters),包含 3 列:id、cat、val id 和 val 是数字,cat 是 varchar。每个 id 有多行。 我还有另一个包含多个列的表 (tb
我想获取字段的不同值,比方说:field1...这需要一个如下查询:“从表中选择不同的(字段1)” 但是,对于某些记录,field1 为空,并且还有另一列可以替代 field1,即 field2。对于
表 1 - 用户 id username items 1 Paul 1(0020);2(0001); 表 2 - 项目 id name 1 name_here 在我的用户的项目中,我输入了 2(000
我想连接同一个表 4 次以获取列的显示方式,我不确定是否可以在 1 个 SQL 语句中完成。 tbl_用户名 id username 1 Adam 2 Bob 3 Chris tbl_机
首先,我刚刚开始自己学习JS,没有任何编程经验,这意味着我仍然要了解这种出色的编程语言的基本构建模块。 我的问题与我编写的以下代码有关: let orderCount = 0; con
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我正在使用 XMAPP,MySQL 正在正常运行。在 phpMyAdmin 中,我不太明白这一点,所以我尝试在 PHP 中创建一个。使用此代码,它会告诉我数据库 benutzer。尽管我在 phpMy
是否有一种高效的算法可以找到平均度最大的子图(可能是图本身)? 最佳答案 The paper "Finding a Maximum-Density Subgraph" by Andrew Goldbe
目录 1、业务背景 2、场景分析 3、流程设计 1、业务流程 2、导入流程
我有 2 个表: 1) 包含自 1900 年 1 月 1 日以来所有日期的 Masterdates 表 2) Stockdata 表,其中包含表单中的股票数据 日期、交易品种、开盘价、最高价、最低价、
我有一个非常复杂的 UI,其状态栏不断变化,其中包含多种类型的状态消息,并且 UI 具有复杂的图表控件和已加载的指示性地理 map 。 现在这些小而复杂的区域的数据上下文具有同样复杂的 ViewMod
有人可以用简单的方式向我解释为什么常量在大 O 表示法中无关紧要吗?为什么添加常量时复杂性保持不变。这不是作业问题,我只是想更好地理解这一点。让我明白这个大 O 是为了看到一个函数在接近无穷大时的行为
我在 flex 搜索索引中有以下文档。 [{ "_index": "ten2", "_type": "documents", "_id": "c323c
我有一个以零碎的方式构建的 LINQ 查询,如下所示: var initialQuery = from item in MyContext where xxx == yyy select item;
我目前正在涉足 SQL,并且希望针对我所创建的问题获得一些帮助。 为了练习一些编程,我正在制作一个 IOU 应用程序。下面是我存储的表我的借条记录(忽略一些相关栏目)。该表允许用户说“嘿,你欠我 X
我是一名优秀的程序员,十分优秀!