当前位置: 首页 > 面试题库 >

递归算法的调试

钮晟
2023-03-14
问题内容

我的问题是是否有一些调试复杂的递归算法的聪明方法。假设我们有一个复杂的例子(在每个“嵌套迭代”中递归计数器都减少时,这不是简单的情况)。

我的意思是在可能发生循环时类似图的递归遍历。

我需要检查我是否在某处没有无限循环。而且仅使用调试器执行此操作并不能给出肯定的答案(因为我不确定算法是否处于无限循环中,还是只是按需进行处理)。

没有具体的例子很难解释。但是我需要的是…

“要检查复杂的递归算法中是否不会发生无限循环”。


问题答案:

您需要就为什么认为算法会终止形成理论。理想情况下,将理论证明为数学定理。

您可以查找问题状态的函数,该函数在每次递归调用时都会减少。例如,请参阅以下来自维基百科的有关Ackermann函数的讨论

A(m,n)的求值总是终止可能不是立即明显的。但是,递归是有界的,因为在每个递归应用程序中,m减小,或者m保持不变,n减小。每次n达到零时,m都会减小,因此m最终也会达到零。(从技术上讲,在每种情况下,对(m,n)的对在字典上的顺序都按对减小,这是一个很好的排序,就像单个非负整数的排序一样;这意味着一个排序不能下降但是,当m减小时,n可以增加多少没有上限,并且通常会大大增加。

那就是您应该考虑将其应用于算法的推理类型。

如果找不到任何方法来证明算法终止,请考虑寻找可以证明其终止的变体。并非总是能够确定任意程序是否终止。诀窍是编写可以证明终止的算法。



 类似资料:
  • 主要内容:递归的底层实现机制编程语言中,我们习惯将函数(方法)调用自身的过程称为 递归,调用自身的函数称为 递归函数,用递归方式解决问题的算法称为 递归算法。 函数(方法)调用自身的实现方式有 2 种,分别是: 1) 直接调用自身,例如: 2) 间接调用自身,例如: 程序中,function1() 函数内部调用了 function2() 函数,而 function2() 函数内部又调用了 function1() 函数。也就是

  • 我最近实现了一个4X4井字游戏的代码,这是使用极大极小算法。然而,我的极大极小函数无限次地递归调用自己。 初始板 (4X4) 井字 - 轮到电脑的代码- 在上面的代码中是船上的空位置,返回“X”(如果玩家X获胜),返回“O”(如果玩家O获胜) checkGameOver函数-

  • 程序调用自身的编程技巧称为递归(recursion),它做为一种算法在程序设计语言中广泛应用。 Java 支持递归,在 Java 编程中,递归是允许方法调用自身调用的属性。调用自身的方法称为是递归的。 递归的典型例子是数字的阶乘。数字 N 的阶乘是 1 到 N 之间所有整数的乘积。例如 3 的阶乘就是 1×2×3。下面的程序使用递归来计算数字的阶乘。 该程序产生的输出如下所示: 3的阶乘是 6 4

  • 我得到了三个整数操作: A-将3添加到number B-将数字 C加倍-交换number 的最后两位数字我应该编写算法来检查我是否可以在n步中使用操作A、B、C制作k素数。最后,我必须打印我用来制作k素数的操作序列。让我们假设我们有函数: 当数字为素数时,函数ifprime返回true,否则返回false。 代码: 我的问题是,我不知道如何记住正确的路径,然后打印出来。

  • 我在用递归解迷宫。我的矩阵是这样的 这是更大矩阵的原型。我的求解递归方法如下所示 你们可以注意到,这里我返回一个布尔值,如果我找到一条路径,它应该会给我一个真值。但它总是给我错误的答案。我不确定我在递归方法中犯的逻辑错误。方法如下 endX=3;endY=10;

  • 本文向大家介绍C#递归算法之归并排序,包括了C#递归算法之归并排序的使用技巧和注意事项,需要的朋友参考一下 归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为: 1)划分子表 2)合并半子表 首先我们来讨论归并算法,归并算法将一系列数据放到一个向量中,索引范围为[first,