如何在for循环中正确调用递归函数?

2023-12-04

我正在尝试实现一个以目标为参数的方法string and an array with string其中的价值观。目标是检查是否可以使用数组的值构造给定的目标字符串。数组中的单词可以根据需要多次使用。例子:

console.log(canConstruct("abcdef", ["ab", "abc", "cd", "def", "abcd"])); // suppose to return true

正如我们所看到的,通过连接"abc" and "def"我们得到目标字符串"abcdef"这是我的函数实现:

const canConstruct = function (target, wordBank) {
  if (target === "") return true;
  console.log(target);
  for (let word of wordBank) {
    if (target.startsWith(word)) {
      return canConstruct(target.replace(word, ""), wordBank);
    }
  }

  return false;
};  

第 2 行是此递归函数的基本情况,然后通过迭代数组检查它是否以数组元素开头,如果为 true,则删除该特定子数组并使用新的目标字符串和旧数组再次调用该函数,如果为 false,则保留迭代整个函数,直到达到基本情况。再次使用前面的例子:

console.log(canConstruct("abcdef", ["ab", "abc", "cd", "def", "abcd"]));  // return false

我得到了错误,通过调试我可以看到它自从第一次递归调用以来就没有迭代整个数组。我得到以下输出:

abcdef
cdef
ef
false

在我看来,这里有一个悬而未决的问题。我们可以多次使用子字符串还是每次只使用一次?也就是说,应该

canConstruct ("abcabc", ["ab", "abc", "cd", "def", "abcd"])

return true因为我们可以把它分解成abc-abc,使用第二个条目两次?

还是应该返回false因为我们已经用完我们的abc一开始?

这两个片段是您的技术的变体,具有不同的风格。

第一个假设我们可以根据需要经常使用子字符串:

const canConstruct = (word, words) => 
  word.length == 0
    ? true
    : words .some (
        (w) => word .startsWith (w) && canConstruct (word .replace (w, ''), words)
      )

console .log (canConstruct ("abcdef", ["ab", "abc", "cd", "def", "abcd"]))  //=> true
console .log (canConstruct ("abcddc", ["ab", "abc", "cd", "def", "abcd"]))  //=> false
console .log (canConstruct ("abcabc", ["ab", "abc", "cd", "def", "abcd"]))  //=> true

第二个说我们只能使用每个一次:

const removeFirst = (x, xs, i = xs.indexOf(x)) =>
  i < 0
    ? [... xs]
    : [... xs .slice (0, i), ... xs .slice (i + 1)]

const canConstruct = (word, words) => 
  word.length == 0
    ? true
    : words .some (
        (w) => word .startsWith (w) && canConstruct (word .replace (w, ''), removeFirst(w, words))
      )

console .log (canConstruct ("abcdef",    ["ab", "abc", "cd", "def", "abcd"]))         //=> true
console .log (canConstruct ("abcddc",    ["ab", "abc", "cd", "def", "abcd"]))         //=> false
console .log (canConstruct ("abcabc",    ["ab", "abc", "cd", "def", "abcd"]))         //=> false
console .log (canConstruct ("abcabc",    ["ab", "abc", "cd", "abc", "def", "abcd"]))  //=> true
console .log (canConstruct ("abcabcabc", ["ab", "abc", "cd", "abc", "def", "abcd"]))  //=> false

这里我们使用一个辅助函数,removeFirst它在删除给定值的第一个实例后返回数组的副本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在for循环中正确调用递归函数? 的相关文章

随机推荐

  • GoogleApiClient 尚未连接异常

    我正在开发的应用程序有时可以正常工作 但有时却会出现此错误 致命异常 java lang RuntimeException 无法暂停活动 com example dell locationapi com example dell locat
  • QStackedWidget - 一页一页地更改页面

    有没有办法更改 QStackedWidget 的页面而不指定实际索引 self homeb clicked connect lambda self stackedWidget setCurrentIndex 0 因此 我不想直接使用按钮直接
  • 统计其他表中不存在的所有记录 - SQL 查询

    我有两 2 个表 我正在尝试计算 Table1 和 Table1 delta 中的所有记录 而 Table1 delta 中的页面名称尚未列出到 Table1 中 如果 Table1 delta 中的 pagename 被列出到 Table
  • Service Fabric 默认发布配置文件而不是 Local.xml

    我们公司正在使用 Service Fabric 开发新应用程序 我们遇到的一个常见问题是 多个开发人员使用远程服务器上的队列 数据库 存储 每个开发人员对此都有不同的配置 所有设置都存储在每个环境的 ApplicationParameter
  • Azure B2C - 在 Azure 中为不同用户类型设置多个登录的单一应用程序

    我正在构建一个 ASP Net core 应用程序 我有两种类型的用户 消费者和供应商 如何在 Azure AD B2C 中为两种不同类型的用户设置两种不同的注册 登录 因此 在我的 ASP 中 我可以有一个页面供消费者使用第三方提供商进行
  • 根据时间范围变量重复行 - R

    我的数据中有一个列变量 它是一个时间范围 datesemployed 样本数据如下 name datesemployed university Kate Oct 2015 Jan 2016 Princeton Sue Nov 2015 De
  • SQL Server 树层次结构和具有重复记录 ID 的嵌套集

    鉴于我有这个结果集结构 多余的字段已被删除 Id ParentId Name Depth 是否可以按树顺序返回记录 即Parent then Children if a Child is a Parent 那么他们的Children 如果不
  • 如何在 Android 中暂停计时器?

    我已经浏览了链接http dewful com tag basic android timer关于android中的定时器应用程序 它运行良好 我需要添加暂停按钮来停止计时器 并添加播放按钮以从我停止的位置再次启动计时器 我能完成那个任务吗
  • 使用 Spring Data Neo4j 进行审计

    我目前正在开发一个使用 Spring Data Neo4j 的项目 每当创建 NodeEntity 时 我想创建一个引用的 Audit NodeEntity 其中包含创建日期和用户 我提出的一个解决方案是编写一个 AOP 方面 它挂接在我的
  • 导入错误 - 没有语言“eng”的本地化支持

    我知道有一个与这个问题相关的问题 但我找不到我所期望的 ImportError Python 中的语言 eng 没有本地化支持 我收到错误 Import Error No localization support for language
  • 如何在ReactJS中实现带有受控组件的动态表单?

    当我查看参考文献中的示例时controlled form components 在react js官网 我想知道应该如何实施form您将能够remove and add input元素以动态方式使其成为受控组件 这可能吗 在例子中我们可以看
  • Node.js Sass 版本 7.0.0 与 ^4.0.0 || 不兼容^5.0.0 || ^6.0.0

    我使用 Node js v16 13 1 并创建了一个 React 应用程序 我尝试使用Sass 但是当我尝试运行它时 出现以下错误 Node Sass 版本 7 0 0 与 4 0 0 不兼容 5 0 0 6 0 0 如果你想使用SCSS
  • 使用 ffmpeg 将图像编码为视频

    我正在尝试将一系列图像编码为一个视频文件 我正在使用 api example c 中的代码 它可以工作 但它在视频中给了我奇怪的绿色 我知道 我需要将 RGB 图像转换为 YUV 我找到了一些解决方案 但它不起作用 颜色不是绿色而是很奇怪
  • Oracle Apex 5 - 页脚栏,类似于 App Builder 中的页脚栏

    如何在 Oracle Apex 通用主题应用程序中创建页脚栏 区域 就像在 Oracle Apex App Builder 中一样 实现该目标所需的 html css 代码是什么 具体来说 我有兴趣更改或替换 UT 中已存在的内容 以替换与
  • sed 用条件替换字符串

    我有一个文件包含几行 每一行的格式如下 2011 07 10 condition hhh aaa value bbb 2011 07 10 condition ccc aaa value bbb 我想使用 sed 查找 aaa 和 bbb
  • 如何正确迁移存储过程?

    我的任务是将站点从旧的客户端服务器转移到新的服务器 我已经从旧服务器完成了 sqldump 并导入到新服务器中 除了使用 mysqli 在 php 中完成的一些 sql 调用之外 它正在工作 我对存储过程不太熟悉 但我注意到失败的是如下所示
  • 如何在 gnuplot 中删除“跳跃”值之间的线?

    我想用包含 跳跃 值的图画一条线 举个例子 当我们绘制几个周期的 sin x 图形并绘制它时 会出现从右到左穿过的不切实际的线 如下图所示 避免这种情况的一个想法可能是使用with linespoints link 但我想在不修改原始数据文
  • 将事件插入带有 Intent 的日历时出错

    我正在尝试将事件插入calendar来自片段 但我不断收到错误 指出没有找到处理 Intent 的活动 这是错误 android content ActivityNotFoundException 找不到处理 Intent 的 Activi
  • 从目录中选择随机文件[重复]

    这个问题在这里已经有答案了 关于如何改进这种方法有什么建议吗 我目前正在使用它从壁纸目录中选择单个壁纸 我知道你不应该再使用 arraylist 但我想不出替代方案 我也不确定如何在目录信息中过滤不止一种类型的文件 即 jpg gif pn
  • 如何在for循环中正确调用递归函数?

    我正在尝试实现一个以目标为参数的方法string and an array with string其中的价值观 目标是检查是否可以使用数组的值构造给定的目标字符串 数组中的单词可以根据需要多次使用 例子 console log canCon