- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
每个递归函数都可以转换为迭代吗?递归函数应该具备什么特征才能使用迭代实现?
我一直在尝试使用迭代来定义以下函数,但似乎行不通!它应该探索迷宫中的所有路径(节点)。任何人都可以使用迭代重写它吗?如果不可能,为什么不呢?
typedef int[0,99] id_t;
bool visited[id_t];
int path[id_t];
int pathCounter = 0;
struct {
id_t id;
bool free;
int neighborNode[4];
} nodeMap[id_t];
void findPath(int current){
visited[current] = true;
for (i : int[0, 3]){
if(nodeMap[nodeMap[current].neighborNode[i]].free == true && visited[nodeMap[current].neighborNode[i]] == false && nodeMap[current].neighborNode[i] != -1){
path[pathCounter] = nodeMap[nodeMap[current].neighborNode[i]].id;
pathCounter++;
findPath(nodeMap[current].neighborNode[i]);
path[pathCounter] = nodeMap[current].id;
pathCounter++;
}
}
path[0] = current;
}
扩展:是否可以在不实现我自己的堆栈的情况下将提到的递归函数转换为迭代?其中一个答案表明,每个尾递归 函数都可以转换为迭代而不 使用堆栈结构...如果是这样,每个递归函数都可以转换为尾递归吗?怎么办?
最佳答案
是的,每个递归函数都可以通过一个相当机械的过程转换为迭代函数。
回想一下,编译器通过使用堆栈实现递归,堆栈通常在 CPU 的硬件中实现。您可以构建自己的软件堆栈,使其适合保存函数的状态(即它的局部变量),将初始状态压入该堆栈,并编写一个 while
循环来压入新的状态入栈而不是进行递归调用,出栈而不是返回,并在栈不为空时继续该过程。
关于每次递归都可以改成迭代吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11708903/
我需要重命名目录中的所有文件。源文件名的一些示例是: alpha--sometext.381928 comp--moretext.7294058 生成的文件将重命名为: alpha.sometext.
我正在尝试编写一个方法,将 CDROM 驱动器从字母 D 更改为字母 Z,但对 WMI 没有任何运气。我可以使用 C# 执行此操作吗? public void setVolCDROM() {
考虑以下简单示例: namespace Calculus { type Func = { (arg: T): T; delta: (arg: T) => T; }; con
我编写了一个隐藏或显示所有应用程序形式(包括子形式)的方法。代码如下: public enum FormState { Show , Hidden, Enable, D
我创建了两个对象。 square1 和 square2 对象。我期望输出 Double line square object。但单个方形对象仅可见。如何做这个可见的双线方形对象? 在我的代码下面。 f
嗯,我有计算器。我想在其中接受值(value) $1,000,000格式 所以下面是我的代码,想知道如何使用 php 替换它们 直播:http://ffsng.deewayz.in/index.php
我看到 grunt.js 中的默认 linter 是 jshint,但我已经习惯了使用 jslint。是否可以更改 grunt.js 使用的 linter? 最佳答案 无耻的 self 推销 有一个插
我使用的是 EF Code First (.NET 4.5 + VS2012)。我的项目正在正确创建和使用 LocalDB。我的机器上也安装了 SQL Server Express (2008R2)。
我创建了包含 5 个 xib 的项目。当我尝试在 iPad 模拟器中运行该项目时。一些 Xibs 将采用 iPhone 屏幕尺寸。我想转换那些支持 iPad Xib 屏幕尺寸的 iphone xib。
我们的应用程序一直在工作。现在,在他们迁移到 bundler 1.0.7 之后,我第一次将一些新代码推送到 Heroku 上。现在我们的应用程序崩溃了,我收到了这个错误消息 - /usr/ruby1.
我是一名优秀的程序员,十分优秀!