Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 有任何分治算法使用递归吗_Algorithm_Divide And Conquer - Fatal编程技术网

Algorithm 有任何分治算法使用递归吗

Algorithm 有任何分治算法使用递归吗,algorithm,divide-and-conquer,Algorithm,Divide And Conquer,我正在和一位同学争论,因为他想说服我,有一种可能性,即分治算法可以在不使用递归的情况下实现 这是真的吗?任何可以用递归实现的算法也可以非递归实现 递归和迭代同样具有表现力:递归可以被显式堆栈的迭代所取代,而迭代可以被尾部递归所取代。哪种方法更可取取决于所考虑的问题和使用的语言 有一件重要的事情需要理解:使用或不使用递归是一个实现决策。递归并不是增加计算能力所必需的(至少对于图灵完备语言来说不是这样)。查找“尾部递归”,了解如何将递归函数转换为非递归函数的简单示例(对于divide et impe

我正在和一位同学争论,因为他想说服我,有一种可能性,即分治算法可以在不使用递归的情况下实现


这是真的吗?

任何可以用递归实现的算法也可以非递归实现

递归和迭代同样具有表现力:递归可以被显式堆栈的迭代所取代,而迭代可以被尾部递归所取代。哪种方法更可取取决于所考虑的问题和使用的语言


有一件重要的事情需要理解:使用或不使用递归是一个实现决策。递归并不是增加计算能力所必需的(至少对于图灵完备语言来说不是这样)。查找“尾部递归”,了解如何将递归函数转换为非递归函数的简单示例(对于divide et impera算法,使用此方法最多可以删除1个递归调用)

有递归可计算的函数/算法没有递归也可计算。重要的是实现算法的语言是否是图灵完备的


让我们举个例子。合并算法也可以以非递归的方式实现,使用队列作为辅助数据结构来跟踪各种合并。

将使用用户定义的堆栈来存储参数仍然计数为递归,尽管在技术上没有递归调用。问题是您考虑递归。如果只是关于实现,并且您使用类似于C语言的简单方式定义递归,那么您可以不使用递归。否则,我的观点是,根据定义,所有的分治算法都是递归的。如果你是自下而上的,你甚至可以在没有队列的情况下进行合并排序。绝对可以!我做了那个特别的例子,因为它更类似于递归版本(将数组拆分为一个项目数组,一次弹出两个分区,合并它们,然后将结果推送到队列中-并重复,直到只有结果留在队列中-而不是对原始数组进行递归调用,以便拆分它并在返回时合并分区)显然,有一百万种方法可以实现该算法。