首先函数的递归调用最为经典的就是按位输出一个整数了。代码如下:
按位输出代码 逆序输出代码
#include<stdio.h> #include<stdio.h>
void lin(int n) void lin(int n)
{ {
int r; int r;
r=n%10; r=n%10;
if(n/10!=0) printf("%d\n",r);
lin(n/10); if(n/10!=0)
printf("%d\n",r); lin(n/10);
} }
int main(void) int main(void)
{ {
int n; int n;
scanf("%d",&n); scanf("%d",&n);
lin(n); lin(n);
return 0; return 0;
} }
可以看出自定义函数中有两个最为重要的部分1、递归语句“lin(n/10)”和2、输出语句“printf("%d\n",r)”。
我把这种类型称为“盒中球”模型。假设有一个盒里面装着一个盒子和一个球,第二个盒子里也装着一个盒子和一个球,第三个盒子里也装着一个盒子和一个球……第n个箱子里也有一个盒子和一个球……直到最后一个盒子里只有一个球。每次打开盒子你都有两个选择:“打开下一个盒子(即代表函数中的进入下一次递归如:lin(n/10)) 或把球拿出来(即代表执行当前语句如:printf("%d\n",r))。这样看来按位输出还是逆序输出只不过是改变了"拿球”还是“开盒子”的顺序。
再甚然更为复杂的函数也只不过是改变了拿球所代表的含义。
初次发表,如有问题,还望斧正。