何为递归

Posted gulugulut

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了何为递归相关的知识,希望对你有一定的参考价值。

1.我们使用的词典,本身就是递归,为了解释一个词,需要使用更多的词。
当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词,可惜,第二个词里仍然有不懂的词,于是查第三个词,这样查下去,直到有一个词的解释是你完全能看懂的,那么递归走到了尽头,然后你开始后退,逐个明白之前查过的每一个词,最终,你明白了最开始那个词的意思。。。

2.天下有奇族人姓计,长生不老。一日其孙问其父:吾之18代祖名何?
其父不明,父问其父
其父不明,父问其父
其父不明,父问其父
其父不明,父问其父
...
晌后,其18代祖回其子:你猜
然其回其子:你猜
然其回其子:你猜
然其回其子:你猜
然其回其子:你猜
……
终,计姓末代孙知其18代祖名“你猜”

此乃,递归
3.什么是递归?这里有一个故事是这样说的:
从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说,从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说,从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说...... 这就是递归

言归正传,递归的本质是一个过程或函数在定义时,出现直接或者间接调用自己的成分。
下面这个求 n! 的例子中,递归出口(确定递归什么时候结束)是fun(1)=1,递归体(确定递归求解时的递归关系)是fun(n)=n*fun(n-1),n>1。
int fun(int n){
    if(n==1)
        return 1;
    else
        return n*fun(n-1);
 }

求n! 的递归思路就是把 f(n)=n! 转化成 fun(n-1) ,再把 fun(n-1) 分解为 f(n-2) 来解决,依此类推直到每个问题都可以直接解决(分解到 fun(1) )。

递归体的一般格式:
f(sn)=g(f(si), f(si+1), …, f(sn-1), cj, cj+1, …, cm)
g是一个非递归函数,cj, cj+1, …, cm为常量

在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储,而栈的空间是有限的,调用层次过多容易造成栈溢出。

 

以上是关于何为递归的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 递归算法

如何为特定值 ex.w[i] == n[i] 设置递归 lapply?

如何解决方程上的递归树问题

实验2 递归和分治法(二分查找)

使用 fluent 为实体框架 4.1 设置递归映射

[Algorithm]Java 版递归算法解迷宫问题哈诺塔问题八皇后问题