简单来说,一个函数直接或者间接调用自身,就是递归调用了~~
递归调用,能用很简单的编码来处理比较繁琐的步骤。
间接调用先不说了,就说直接调用吧,我知道的也就是入门的知识。。。
间接调用的思想类似直接调用就是被调用的函数种类多了。
例如求一个正整数n的阶乘,咱们知道5以内的很好算,如果再大点就麻烦了,如果好几十甚至上百就更繁琐了,用程序语言的循环语句神马的直接来实现也不太现实。
n的阶乘,就是 n!= n * (n-1) *(n-2) * ... * 2 * 1 = n * (n-1)!。
我们知道当n=1时候,n! = 1; 然后我们还规定(这个不太符合我们的思想) 0! = 1;这个规定有助于数学计算。
然后给我们一个数,n 让我们求它的阶乘,我们就像了~~阶乘嘛,就是从n连乘到1,当然了n = n * (n-1)!
而且还有,当n是1或者0的时候,阶乘是1.于是我们有个简单的结成函数:
int fun(int n)
{
if (n > 1)
{
return (n * fun(n-1));
}
else
{
return (1);
}
}
// 说一下,这里没考虑输入n是负数啊,字符型啊,甚至是char型号的情况,这个例子只是简单介绍下递归调用,函数就看功能实现吧。。。
这个函数是说,给你一个n,你就返回n的阶乘。那么捋顺一下流程吧~~ f
假如当n=5时候,调用 fun(5),此时就要开辟一个新空间来运行fun(5)这个函数了:
fun(5)
fun(5)
------等于
------等于
5*fun(4)
120
↓调用fun(4)开辟fun(4)空间
↑返回fun(4)的结果,回收,fun(4)空间
fun(4)
fun(4)
------等于
------等于
4*fun(3)
24
↓调用fun(3)开辟fun(3)空间
↑返回fun(3)的结果,回收fun(3)空间
fun(3)
fun(3)
------等于
------等于
3*fun(2)
6
↓调用fun(2)开辟fun(2)空间
↑返回fun(2)的结果,回收fun(2)空间
fun(2)
fun(2)
------等于
------等于
2*fun(1)
2
↘调用fun(2)开辟fun(1)空间
↗返回fun(1)的结果,回收fun(1)空间
这里是返回到fun(2)按照顺序来
此时n=1,直接返回数值:fun(1)=1
不再继续调用fun()函数
这就是流程了,看下箭头,不太熟悉给字体变颜色,凑合看吧。。。
一般来说,设计函数的递归,你要找到其中某些数据变化从而引起其他数据(结果)变化的关系,不过处理
什么最终都得落到处理数据这个层面上,因为计算机就是处理的数据。
在阶乘例子里面,关系就是当n是大于1的整数时候等于n*(n-1)!;当n=1或者n=0时候等于1。
这个关系的选择类似数学里面数学归纳法的那么个思想,呃。。
剩下的一个就是处理好递归调用的结尾,以为一直是调用某个函数,那么总得有个头啊,
在这里就是当n=1或者n=0时候等于1,也就是函数返回1,不再继续调用函数了,然后递归调用开始依次序,以后来先至的顺序依次回归。
关于递归,找几个例子,自己拿着纸和笔,一步步画一下流程吧,理解的多了就能熟练了,
希望楼主学习编程能取得好的进展