递归的相关性

时间:2011-05-02 16:21:09

标签: language-agnostic recursion

所以我现在正试图掌握递归的概念,并且我理解我遇到的大多数问题,但我觉得它的使用不适用于太多的计算问题。这只是一个新手的假设,所以我问,作为程序员,递归有很多实际用途吗?而且,它可以解决哪些典型问题?我见过的唯一一个是堆排序和脑筋急转弯类型的问题,比如“河内的塔楼,看起来非常具体,缺乏广泛的用途。”

由于

7 个答案:

答案 0 :(得分:3)

编程中有很多用于递归的用法 - 一个典型的例子是导航树结构,你可以在其中调用导航函数,发现每个子元素等等。

答案 1 :(得分:3)

以下是一些在没有递归的情况下几乎不可能的字段:

  • XML,HTML或任何其他树,如文档结构
  • 编译和解析
  • 自然语言处理
  • Divide and conquer algorithms
  • 许多数学概念,例如factorials

递归可以为其他复杂问题提供出色的解决方案。如果你对作为一门艺术的编程感兴趣,你真的应该深入研究。

哦,如果你不确定,这里有一个明确的递归定义:

  

递归(名词):参见“递归”

答案 2 :(得分:1)

这取决于你想要做什么。作为一名C#/ ASP.NET开发人员,我每年可能会编写不到一个递归函数进行企业Web工作。当我搞砸我的爱好代码(主要是统计研究)时,我发现有更多机会应用递归。部分原因是主题,部分原因在于我更加依赖客户在进行公司工作时已经决定的第三方库(需要递归的算法已经实现)。

答案 3 :(得分:0)

这不是你每天都在使用的东西。但是许多关于搜索和排序数据的算法都可以利用它。通常,大多数递归算法也可以使用迭代编写;通常递归版本更简单。

答案 4 :(得分:0)

如果您查看与此问题“相关”的问题,您会发现有关递归的“过多”内容,可以帮助您更好地理解它。

递归不是新事物,它不仅仅是一个玩具概念。从有计算机之前就已经出现了递归算法。

“阶乘”的经典定义是一个很好的例子:

fact(x) =
if x < 0 then fact(x) is undefined
if x = 0 then fact(0) = 1
if x > 0 then fact(x) = x * fact(x-1)

这不是由计算机爱好者创造的,他们认为递归是一个很酷的玩具。这是标准的数学定义。

答案 5 :(得分:0)

作为程序构造,调用递归几乎不会被使用,除非在极高级语言中,您希望编译器将其优化为不同的构造。使用调用递归,除非您可以在深度上建立小边界,导致堆栈溢出,而不是那种能够为您回答问题的好的Stack Overflow。 : - )

另一方面,作为算法概念的递归非常有用。使用任何递归定义的数据格式(如HTML或XML,或分层文件系统)以及在搜索,排序和(每个人最喜欢的)图形渲染中实现重要算法的关键,无数其他领域。

答案 6 :(得分:0)

有几种语言不支持循环(即for和while),因此当你需要重复行为时,你需要使用递归(我相信J没有循环)。在许多示例中,递归需要更少的代码。例如,我编写了一个isPrime方法,它只用了两行代码。

public static boolean isPrime(int n) { return n!=1&&isPrime(n,2); }

public static boolean isPrime(int n,int c) { return c==n||n%c!=0&&isPrime(n,c+1); }

迭代解决方案将需要更多代码:

public static boolean isPrime(int n)
{
    if(n==1) return false;
    int c=2;
    while(c!=n)
    {
        if(n%c==0) return false;
    }
    return true;
}

另一个很好的例子是当您使用ListNodes时,例如,如果您想检查ListNode中的所有元素是否相同,递归解决方案会更容易。

public static <E> boolean allSame(ListNode<E> list)
    {
        return list.getNext()==null||list.getValue().equals(list.getNext().getValue())&&allSame(list.getNext());
    }

迭代解决方案看起来像这样:

public static <E> boolean allSame(ListNode<E> list)
{
    while(list.getNext()!=null)
    {
        if(!list.getValue().equals(list)) return false;
        list=list.getNext();
    }
    return true;
}

如您所见,在大多数情况下,递归解决方案比迭代解决方案更短。