程序代码如下:
#include <stdio.h>
void up_down(int n)
{
printf("Level %d: n location %p\n",n,&n);
if(n < 4)
up_down(n+1);
printf("Level %d: n location %p\n",n,&n);
}
int main()
{
up_down(1);
}
输出:
Level 1: n location 0060FEF0
Level 2: n location 0060FED0
Level 3: n location 0060FEB0
Level 4: n location 0060FE90
Level 4: n location 0060FE90
Level 3: n location 0060FEB0
Level 2: n location 0060FED0
Level 1: n location 0060FEF0
递归在程序设计中采用栈的模型。当函数调用另一个函数时采用进栈的方式,当函数执行完后退一层栈。
递归适合处理倒序。
递归很有意思的!看这个程序
#include <stdio.h>
void fac(int i,int *num)
{
*num = *num + i;
if(i > 1)
fac(i-1,num);
}
int main()
{
int i = 0;
fac(100,&i);
printf("%d",i);
}
输出:
5050
寥寥数语解了高斯问题。
#include <stdio.h>
void fac(int i,int *num)
{
*num = *num * i;
if(i > 1)
fac(i-1,num);
}
int main()
{
int i = 1;
fac(12,&i);
printf("%d",i);
}
16的累乘
479001600
往上就超出了一般能表示范围。
魔鬼数值转换器:
#include <stdio.h>
int d;
void z(int i,int num)
{
if(num != 0)
{
z(i,num/i);
d = num%i;
}
if(num != 0)
printf("%d",d);
}
int main()
{
int num = 1024;
z(2,num);
}
真的只有这样精简。
加强版:
#include <stdio.h>
#include <stdlib.h>
int d;
void z(int i,int num)
{
if(num != 0)
{
z(i,num/i);
d = num%i;
}
if(num != 0)
printf("%d",d);
}
int main()
{
char ch;
system("chcp 65001");
printf("Q键退出\n");
for(;;)
{
fflush(stdin);
printf("请输入一个要数值转换的整数:\n");
int num;
int di;
while(scanf("%d",&num))
break;
getchar();
printf("请输入转换进制数:\n");
while(scanf("%d",&di))
{
if(di <= 1||di > 10)
{
printf("进制数有误!\n");
continue;
}
else
break;
}
if(num == 0)
printf("%d",d);
else
z(di,num);
fflush(stdin);
ch = getchar();
if(ch =='q'|| ch =='Q')
break;
}
}
控制台:
Active code page: 65001
Q键退出
请输入一个要数值转换的整数:
87663
请输入转换进制数:
11
进制数有误!
8
253157
请输入一个要数值转换的整数:
999999999
请输入转换进制数:
10
999999999
请输入一个要数值转换的整数:
763723
请输入转换进制数:
9
1383561
请输入一个要数值转换的整数:
中间的Active code page: 65001是因为gcc对中文支持不好,所以调用的代码页解释方法转换。
分析一下这里:
void z(int i,int num)
{
if(num != 0)
{
z(i,num/i);
d = num%i;
}
if(num != 0)
printf("%d",d);
}
当num/i等于0是从第一个if跳出,但此时num为0,从而printf函数会打印出0值,但是我们不希望打印0值,所以第二个if是必要的。
这样就更精简又稳固了:
void z(int i,int num)
{
if(num != 0)
{
z(i,num/i);
d = num%i;
printf("%d",d);
}
}
没错,这就是递归进制转换的核心代码。在进制转换中,我们处理的第一步往往是要输出的最后一步。所以,在递归调用之后打印计算结果,等于倒序计算。