Algorithm 查找操作序列

Algorithm 查找操作序列,algorithm,pseudocode,Algorithm,Pseudocode,这最终应该用JavaScript编写。但我觉得在我的算法清晰之前,我不应该键入任何代码,事实并非如此 给出的问题:从1开始,编写一个函数,该函数给定一个数字,返回一系列操作,这些操作只包含产生所讨论的数字的“+5”或“*3” 我的基本算法: 拿到号码了吗 如果数字为1 返回1 否则如果我们超过这个数字 返回-1 否则,继续尝试“+5”或“*3”,直到达到数字,假设可以达到 我的问题在于第4步:我发现有两条路径可以将我带到有问题的数字(目标),要么是“+5”,要么是“*3”,但是如果这两条路径都可

这最终应该用JavaScript编写。但我觉得在我的算法清晰之前,我不应该键入任何代码,事实并非如此

给出的问题:从1开始,编写一个函数,该函数给定一个数字,返回一系列操作,这些操作只包含产生所讨论的数字的
“+5”
“*3”

我的基本算法:

  • 拿到号码了吗
  • 如果数字为1
    返回1
  • 否则如果我们超过这个数字
    返回-1
  • 否则,继续尝试
    “+5”
    “*3”
    ,直到达到数字,假设可以达到
  • 我的问题在于第4步:我发现有两条路径可以将我带到有问题的数字(目标),要么是
    “+5”
    ,要么是
    “*3”
    ,但是如果这两条路径都可以找到数字13呢??我只能做一件或另一件事!
    我怎么知道该走哪条路,该走多少次?我如何在路径之间来回跳转?

    您基本上想要做一个宽度优先的二进制搜索树。可以使用递归,也可以使用while循环。每一步取当前数字,加5或乘以3。进行测试,如果找到输入值,则返回0或其他值(未指定)

    这里的关键是了解数据结构以及如何搜索它。你明白为什么应该是广度优先吗?你明白为什么它是二叉树吗

    针对评论: 首先,我钦佩你的努力。解决这类问题,独立于语言,是解决问题的好方法。这与Javascript(或任何其他语言)中的愚蠢伎俩无关

    因此,第一个概念是,如果你没有找到一个返回值-1,你就“搜索”一个解决方案

    第二,你应该对二叉树做一些研究。它们是一个非常重要的概念


    第三,你应该进行广度优先搜索。然而,这是最不重要的。这只会使问题更有效。

    我同意二叉树中广度优先搜索的概念。但是,我建议扭转这个问题,看看使用“-5”或“/3”从目标返回到1的问题。这允许基于目标进行修剪

    例如,13不能被3整除,因此目标13的向后问题的第一步必须是“-5”,而不是“/3”


    它不会改变复杂度,但在小问题的实际应用中可能会使算法更快。

    那么可以通过混合两条路径找到的数字13呢??我只能做一件或另一件事

    嗯,实际上你两者都可以。正如您在书中提到的例子,您将看到函数
    find
    在其内部被调用了两次——函数在任何选择点尝试两条路径,并返回第一个正确的解决方案(您还可以尝试更改整个函数,使其返回所有正确的路径)

    我如何知道该走哪条路以及该走多少次?如何在路径之间来回跳转?


    基本上,在两条路径之间来回跳跃是通过两条路径的移动来实现的。如果函数达到目标值,您就知道它是否是正确的路径

    谢谢你的回复。我不是计算机科学专业的学生,因此不熟悉这些主题。我在自学。我在一本名为《雄辩的JavaScript》的书的第3章中发现了这个问题。你建议我研究什么来理解这一点?我是说宽度和二叉树是我不熟悉的。@DEdesigns57我建议搜索“二叉树”、“宽度优先”、“深度优先”和“递归”。或者,找一本索引中有这些术语的算法书,读一读。你查过了吗?