这最终应该用JavaScript编写。但是我觉得在我的算法清楚之前我不应该输入任何代码,这不是!
问题给定:从1开始,写一个给定数字的函数返回一系列操作,这些操作只包含产生相关数字的"+5"
或"*3"
。
我的基本算法:
"+5"
或"*3"
,假设可以到达。我的问题在于第4步:我看到有两条路径可以将我带到有问题的数字(目标),"+5"
或"*3"
,但是13号,可以通过MOTTURE的BOTH路径找到?我只能做一件事或者另一件事!
我怎么知道要采取哪条路径以及我应该走多少次?我将如何在路径之间来回反弹?
答案 0 :(得分:1)
我同意二叉树中广度优先搜索的概念。但是,我建议解决问题,并考虑使用“-5”或“/ 3”从目标返回到1的问题。这允许基于目标进行修剪。
例如,13不能被3整除,因此目标13的向后问题的第一步必须是“-5”,而不是“/ 3”。
它不会改变复杂性,但可以使算法在实践中更快地解决小问题。
答案 1 :(得分:0)
你基本上想要做一个广度优先的二叉搜索树。你可以使用递归,或只是一些while循环。每一步你取当前数字并加5或乘以3.做你的测试,如果找到输入值,则返回0或其他(你没有指定)。
这里的关键是关于数据结构以及如何搜索它的事情。你明白为什么它应该先宽广吗?你明白为什么它是二叉树吗?
回应评论: 首先,我很佩服你的努力。解决这种独立于语言的问题是解决问题的好方法。它不是关于Javascript(或任何其他语言)的愚蠢技巧。
因此,如果你没有找到一个返回-1,那么第一个下来的概念是你“搜索”一个解决方案。
其次你应该对二叉树做一些研究。它们是一个非常重要的概念!
第三,你应该先进行广度搜索。然而,这是最不重要的。它只会使问题更有效率。
答案 2 :(得分:0)
what about the number 13 which can be found by a MIXTURE of BOTH paths?? I can only do one thing or the other!
嗯,实际上你可以做到这两点。正如您提到的本书的chapter 3中的示例所示,您将看到函数find
在其自身内部被调用两次 - 该函数在任何选择点尝试两个路径并且第一个正确的解决方案返回(您还可以尝试更改整体功能,以便返回所有正确的路径)。
How would I know which path to take and how many times I should take that path? How would I bounce back and forth between paths?
基本上,在路径之间来回弹跳是通过两者都行进来实现的。如果函数达到目标数,您知道它是否是正确的路径。