除了生成Fibonacci序列之外,递归的一个很好的例子是什么?

ura*_*ray 26 c++ algorithm recursion fibonacci

可能的重复:
递归的真实
示例递归函数的示例

我看到,通过一个简单的例子是如何产生的斐波那契序列大多数编程语言教程教递归,我的问题是,有没有比产生Fibonacci序列解释递归是如何工作之外的另一个很好的例子?

pax*_*blo 38

经典是二叉树搜索:

def findval (node,val):
    if node == null:
        return null
    if node.val = val:
        return node
    if node.val > val:
        return findval (node.left,val)
    return findval (node.right,val)

findval (root,thing_to_find)
Run Code Online (Sandbox Code Playgroud)

这可能是比简单的公式稍微复杂一些,但它的"面包和黄油"使用递归的,它说明了最好的地方使用它,在递归级别最小化.

我的意思是:你可以添加两个非负数:

def add (a,b):
    if b == 0:
        return a
    return add (a+1,b-1)
Run Code Online (Sandbox Code Playgroud)

但你会发现自己跑出来的堆栈空间很快为大量(除非编译器优化过程中的尾端递归,但你可能应该忽略教你关注的水平).

  • 不,虽然_looks_像Python一样,但它确实是伪代码(我发现Python是一个非常好的伪代码模板).我只是说,如果编译器没有执行尾端优化,你需要非常严格地控制堆栈级别,以免你用完. (3认同)

Phi*_*ipp 28

其他答案提到了各种算法,这完全没问题,但是如果你想要更具体的"具体"示例,你可以列出某些目录及其子目录中的所有文件.分层文件系统是一个众所周知的递归(树)结构示例,您可以使用此具体示例显示深度优先和广度优先搜索.


eta*_*ion 25

我最喜欢的递归的例子是河内塔:要摆脱极A到B极片的堆栈,你的一举一动都最低的一块,是不是A或B极上面,然后将最低片到B,然后你移动你放在最低部分顶部的"辅助杆"的堆栈.对于第一步和第三步,您将递归地遵循此指令.请参阅链接以获得更长的解释:)


Lui*_*uis 20

检查一个palyndrome:

bool recursivePalindrome(std::string str, unsigned int index = 0) {
    if (index > str.length()/2) return true;
    else if (str[index] == str[str.length()-index-1])
        return recursivePalindrome(str, ++index);
    else return false;
}
Run Code Online (Sandbox Code Playgroud)

或者说不太严肃的话:)

void StackOverflow()
{
   StackOverflow();
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然一个好的尾端优化器只会将其转换为`while(1);`:-) (13认同)

Sha*_*fiz 15

怎么样找到阶乘.

int GetFactorial(int n )
{
  if ( n==0) return 1;
  return n*GetFactorial(n-1);
}
Run Code Online (Sandbox Code Playgroud)

这个想法是,因子被递归地定义为n和(n-1)的阶乘的乘积.从递归定义,你得到你的递归.

  • 没错,但它足够不同了:) (4认同)
  • @sbi与斐波纳契不同,递归计算阶乘与使用合理迭代方式的大O运行时相同,所以它绝对是一种改进.另一方面,它不会演示多个递归调用. (2认同)

Doc*_*own 12

遍历目录树的文件夹层次结构作为文件系统的一部分是一个很好的现实世界的例子.查看此SO帖子中的C++示例:

为什么我在递归删除目录时遇到问题?

  • +1因为您不需要花费任何脑力来理解用例(与基于数学的问题不同),所以您可以专注于递归方面. (4认同)

Gra*_*amS 10

合并排序是一种非常好的算法示例,在递归实现时更易于阅读和理解.

这是Merge Sort的一个高级伪代码版本:

def merge_sort(List sortlist)
    if sortlist.length <= 1 return sortlist
    split sortlist into leftlist and rightlist
    return merge(merge_sort(leftlist), merge_sort(rightlist))   

def merge(List leftlist, List rightlist)
    while(leftlist and rightlist not empty)
        compare leftlist.first to rightlist.first
        pop lowest value off its list and append to resultlist
    append any remains of leftlist onto resultlist
    append any remains of rightlist onto resultlist
    return resultlist
Run Code Online (Sandbox Code Playgroud)

编写和可视化的迭代版本会复杂得多.


thr*_*rag 10

  • 这里给出的大多数其他示例都是数学示例,它们实际上只是重新说明了相同的递归应用.
  • 搜索和排序变体是很好的算法示例,但对于初学者来说往往有点过于复杂.
  • 河内的塔楼是一个经典但非常人为的设计.

================

我用来演示递归的简单功能的例子是目录树中的递归文件处理.

这是一个C#示例

void ProcessFiles( string sFolder )
{
    foreach( string f in Directory.GetFiles( sFolder ) )
    {
        DoSomethingTo( f );
    }
    foreach( string d in Directory.GetDirectories( sFolder ))
    {
        ProcessFiles( d );
    }
}
Run Code Online (Sandbox Code Playgroud)


Sae*_*iri 5

有几个样本:

加泰罗尼亚语数字:

T(n) = Sum(T(i)*T(n-i)) for all 1 <= i < n
Run Code Online (Sandbox Code Playgroud)

阿克曼功能:

A(x,y) = y+1 (if x = 0)
A(x,y) = A(x-1,1) (if y=0)
A(x,y) = A(x-1, A(x,y-1)) otherwise.
Run Code Online (Sandbox Code Playgroud)

简单的迷宫问题

找出哈密顿路径问题

阶乘.

你可以看到其他参考的维基页面.


kri*_*iss 5

递归的好例子通常与底层数据结构或问题本身是递归的情况有关:树,图,使用分而治之法的算法(如许多种类),递归语法的解析器(如常见的算术表达式),查找策略象棋般的两个玩家游戏(一个简单的例子考虑Nim),组合问题等.