当前位置: 首页 > 知识库问答 >
问题:

这些都是递归解

秦锐
2023-03-14

每个人都知道饼干桶三角桩接龙游戏。你拿一个钉子,跳过另一个,跳进一个空洞,目标是只剩下一个钉子。

在游戏板对象代码中,我有一个函数sCpeg(inta,intb),它改变了你当前用来跳转的peg。为了解决这个问题,我将其连接到一个moves变量。每次你改变当前的钉住并使用它跳跃时,这算是一次移动。这是一个非常基本的启发式搜索算法,我希望是一个搜索算法:探索所有可能的跳跃可用一个peg。如果没有找到回溯的解决方案,请更新当前的peg并重复该过程。

当我写下这个想法时,这听起来像是一个使用递归的完美例子,只是我不知道如何在这个场景中正确使用递归。在回溯和更新当前peg之间,我迷失了方向。

这一切听起来太复杂了吗?我是否应该删除移动和sCpeg()选项,让搜索算法随机跳转,直到找到解决方案?

递归是解决这个难题的好方法吗?我的跳转函数目前只要求你想跳到的位置。我必须改变它,以获得每次跳转所需的开始和结束位置,这很容易改变,但我不知道对算法来说是好是坏。

这是一个学校项目,所以我必须实现一个不知情的搜索和一个启发式搜索算法。改变我的<代码>跳转()函数可能会影响我的启发式。

我用Java编写代码,但由于这有点模糊,我只希望得到伪代码的答案。单靠伪代码就足以让我走上正轨。

共有1个答案

晏弘雅
2023-03-14

以下是递归解决方案的框架:

// given a board description, outputs solution sequence string, or null if no soln
public String sCpeg(boardDescription bd)
  if bd is solution state, return "" // termination of successful recursion
  for each possible move m
    calculate result of m on bd to obtain newbd
    store result of sCpeg(newbd) in subresult
    if subresult is not null, return m + subresult
  end for
  // if we're here, no move worked -- termination, unsuccessful
  return null

我想就这些了。

这类问题还有另一个框架:图形理论。图的节点是板状态。如果你能从另一个得到一个,我们用箭头连接两个板状态。然后你在图中搜索连接开始到结束的最短路径...使用有向图算法中的任何标准最短路径。

但是你的递归想法应该很好用。

 类似资料:
  • 我想我理解了教科书中对尾部递归函数的定义:在函数调用后不执行任何计算的函数。我还发现,作为一个结果,尾部递归函数的内存效率会更高,因为它每次调用只需要一条记录,而不是每次都需要保留一条记录(就像在普通递归中那样)。 我不太清楚的是,这个定义如何应用于嵌套调用。我将提供一个例子: 我最初给出的答案是,根据定义,它不是尾部递归的(因为外部调用是在计算内部调用之后执行的,所以其他计算是在第一次调用之后完

  • 我有一个(co?)递归函数对,它们处理元组列表,并根据一些开始和结束条件将它们折叠成批处理。 我做得不多,所以我可能很愚蠢。 我已经修改了一个简单的非尾部递归版本,通过明确引入一个“tot”参数来构成当前折叠状态,我认为这是尾部递归的,但我在大输入上得到了可怕的堆栈溢出。。。。(在调试器和(调试)中)。exe) 作为一个明确的折叠,可能有更好的方法来做到这一点...但这几乎不是重点,重点是为什么它

  • 我仍在尝试实现2-3个手指树,并取得了良好的进展(存储库)。在做一些基准测试时,我发现当树非常大时,我非常基本的toList会导致堆栈溢出异常。起初,我看到了一个简单的修复方法,并将其设置为尾部递归。 不幸的是,事实证明,toList不是罪魁祸首,但viewr是: 寻找唯一的递归调用很明显,这不是尾部递归。不知何故,我希望这个问题不会存在,因为这个调用被包装在一个类似于连续的延迟中。 我听说并读过

  • 问题内容: 我一直在尝试将编程的递归作为一个概念进行研究(尽管我专门研究Java),而这正是我最好的理解: 例如,在现实生活中,递归是当我们将两个反射镜彼此相对放置并且它们之间产生的图像是递归的。 但是我在编程中没有得到这个算法吗?有人可以给我一个简化的例子来理解递归吗? 问题答案: 基本上,函数是递归的 函数具有简单的基本情况,何时 所有其他情况都有规则化简为基本情况。 例如,要计算阶乘:

  • 问题内容: 我编写了以下函数,以实现自己的二进制搜索 我知道我的实现已经关闭,但是我对理解递归堆栈更加好奇。 当我调用时,我的函数应返回的值 但相反,它返回None。此外,当我直接调用时 ,我得到的正确值为0。这怎么可能? 问题答案: 您将忽略递归调用的返回值。您还需要 显式地 返回它们: 递归调用与其他任何函数调用一样;他们将结果返回给调用者。如果忽略返回值,然后调用函数结束,那么您将以该调用函

  • 递归是一种解决问题的方法,将问题分解为更小的子问题,直到得到一个足够小的问题可以被很简单的解决。通常递归涉及函数调用自身。递归允许我们编写优雅的解决方案,解决可能很难编程的问题。