在我多年的编程中,我已经使用递归来解决简单的问题,但我完全清楚,有时你需要迭代,因为内存/速度问题.
所以,在很久以前的某个时候,我去尝试找出是否存在任何"模式"或文本书的方式将常见的递归方法转换为迭代而没有发现任何东西.或者至少我记不住任何事都会有所帮助.
说到处recursion都使用for循环是否正确?如果递归通常较慢,那么将其用于循环迭代的技术原因是什么?
如果始终可以将递归转换为for循环,那么可以采用经验法则吗?
据我所知,大多数递归函数可以使用循环重写.有些可能比其他人更难,但大多数都可以重写.
在哪些情况下,使用循环重写递归函数是不可能的(如果存在这样的条件)?
可能重复:
是否存在无法使用尾递归写入的问题?
根据我的理解,尾递归是一种优化,当递归调用不需要来自它将发送垃圾邮件的递归调用的信息时,您可以使用它.
那么可以使用尾递归实现所有递归函数吗?像DFS这样的东西,你需要最内层的孩子在父母可以之前返回?
是否有一个只有一个递归解决方案,那就是,有一个递归解决问题的问题,而是一个迭代的解决方案还没有被发现,或者更好的是,已被证明是不存在的(显然,这不是一个尾递归)?
MATLAB是一种按值传递的语言.我有一个处理像素邻居的递归函数.每次调用函数时,复制图像(在我的情况下是两个图像)是非常昂贵的.
我使用全局变量来解决问题.有没有其他方法可以使递归函数修改数组?
给出这个函数的伪代码
f(0) = 1;
f(1) = 3;
f(n) = 3 * f(n - 1) - f(n - 2); // for n >= 2.
Run Code Online (Sandbox Code Playgroud)
有这种非递归方式吗?
我正在用C++搞乱尾递归函数,而且我在使用g ++编译器时遇到了一些麻烦.
当numbers[]大小超过几百个整数时,以下代码导致堆栈溢出.检查由g ++生成的汇编代码,表明twoSum_Helper正在call对自身执行递归指令.
问题是以下哪一项导致了这种情况?
我正在g++ -O3 -Wall -fno-stack-protector test.c通过MinGW和g ++ 4.5.0在Windows Vista x64上进行编译.
struct result
{
int i;
int j;
bool found;
};
struct result gen_Result(int i, int j, bool found)
{
struct result r;
r.i = i;
r.j = j;
r.found = found;
return r;
}
// Return 2 indexes from numbers that sum up to target.
struct result twoSum_Helper(int numbers[], int size, int target, int i, …Run Code Online (Sandbox Code Playgroud) 我所见过的Dijkstra算法的所有实现都没有递归函数,但我还读到,根据定义,动态编程是一种具有递归函数和已计算事物的"记忆"的算法.
那么Dijkstra的算法是否具有作为动态编程的循环?
或者为了有资格作为动态算法,我必须将循环更改为递归函数.
让我们来看看Knight Tour问题吧.可以转换为迭代吗?困扰我的是回溯部分.如何在循环中回溯?当我从递归到迭代时,是否必须使用堆栈数据结构来实现回溯?
我在这里以更好的方式问了这个问题:有人能通过代码描述一个回溯迭代而不是递归的实际例子吗?