函数递归

程序代码如下:

#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);
	}
}

没错,这就是递归进制转换的核心代码。在进制转换中,我们处理的第一步往往是要输出的最后一步。所以,在递归调用之后打印计算结果,等于倒序计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值