也可以说是种嵌套吧,层层调用函数本身,直接符合某种条件有确定的值,再层层返回,就能得到最终的结果! 举个简单例子,数的阶乘:private static long recursion(int m) { long value = 0; if(m==1||m==0) value = 1; else if(m>1) { value = m*recursion(m-1); } return value; }假如当要计算5的阶乘时,输入5,函数就反复调用自身,先计算4的阶乘、3的阶乘、2的阶乘、直到m减到1时,有确定的结果,再开始返回值,2的阶乘的值->3的阶乘的值->4的阶乘的值->5的阶乘的值,最终结果就是这样得到的。 不知道这样的分析,楼主能否看得懂?
但是在有的时候自己不能掉自己啊 public static int i = 1; public static void diguishouw() { System.out.println(i); if (i < 5) { diguishouw(); System.out.println("this is recursion" + i); i++; } } public static void main(String[] args) { System.out.println(i); diguishouw(); } 这样些是不是不对人啊
f(x)=1 (x=1)
f(x)=2 (x=2)
f(x)=f(x-1)+f(x-2) (x&gt;2)
也就是说从第三项开始的每一项的值都等于是前两项之和。这在数学中叫递推数列--高中数学内容。
如果把它变为一个要求第n个菲波纳契数的代码的话,应该如下所示(为了避免语言不通:)我使用伪代码):
int f(int step)
在这里x为上面所说的x变量,也就是要求的是第x项的值
{
if step=1
{
return 1
}
else if step=2
{
return 2
}
如果求得是第一项和第二项的话,就分别返回1和2,并退出函数return f(x-1)+f(x-2)
否则的话就返回前面两项的和
}
这里的关键是最后一句。这里函数的返回直又要反过去调用它自身计算前面两项的值,这样就会反复调用,直到x变量在某次调用中变为1和2,返回已知的第一项和第二项的值,在层层返回,最后得出要求的第x项的值
说到本质的话,递归是一段程序的代码反复效用,把程序的参数等变量保存在一个堆栈里,直到到了边界条件以后再层层返回,将堆栈中的数据弹出计算,最后得到结果
对于一个集合X,其中的一个元素a,定义在X上的函数f,存在唯一的F:N->X(N为自然数集),使得
F(0)=a
F(n+1)=f(F(n))
集合论证明了这样递归定义的函数F存在且唯一
举个简单例子,数的阶乘:private static long recursion(int m) {
long value = 0;
if(m==1||m==0) value = 1;
else if(m>1) {
value = m*recursion(m-1);
}
return value;
}假如当要计算5的阶乘时,输入5,函数就反复调用自身,先计算4的阶乘、3的阶乘、2的阶乘、直到m减到1时,有确定的结果,再开始返回值,2的阶乘的值->3的阶乘的值->4的阶乘的值->5的阶乘的值,最终结果就是这样得到的。
不知道这样的分析,楼主能否看得懂?
public static int i = 1; public static void diguishouw() {
System.out.println(i);
if (i < 5) {
diguishouw();
System.out.println("this is recursion" + i);
i++;
} } public static void main(String[] args) {
System.out.println(i);
diguishouw();
}
这样些是不是不对人啊