c语言——理解递归

#include <stdio.h>
void up_and_down(int n);

int main()
{
	up_and_down(1);
	return 0;
}

void up_and_down(int n)
{
  printf("level %d:n location %p\n",n,&n);
  if (n<4)
  up_and_down(n+1);
  printf("level %d:n location %p\n",n,&n);

}

运行结果为:
level 1:n location 0019FEE0
level 2:n location 0019FE88
level 3:n location 0019FE30
level 4:n location 0019FDD8
level 4:n location 0019FDD8
level 3:n location 0019FE30
level 2:n location 0019FE88
level 1:n location 0019FEE0
Press any key to continue
可以看出,关键在于,up_and_down函数的递归操作形成了一条函数调用链,从fun1调用fun2,fun2调用fun3。。。当fun4结束时,控制传回fun3(),当fun3结束时,控制传回fun2,当fun2结束时,控制传回fun1.递归的情况与此类似,但是其实就是调用自身而已。
值得注意的是每次调用函数,都会开辟新的内存空间,就是说第一次调用up_and _down函数与第二次调用时,变量n其实已经不一样啦。

尾递归

尾递归是一种最简单的递归,把递归调用放到了函数的末尾,即正好在return语句之前。尾递归是最简单的递归,因为它相当于循环。

#include <stdio.h>
long fact(int n);
long rfact(int n);
int main(void)
{
  int num;
  printf("this program calculates factorials.\n");
  printf("enter a value in the range 0-12(q to quit):\n");
  while(scanf("%d",&num)==1)
  {
    if (num<0)
		printf("No negative numbers,please.\n");
	else if (num>12)
	{
		printf("Keep input under 13.\n");
	}
    else
	{
	printf("loop :%d factorial = %ld \n",num,fact(num));
	printf("recursion:%d factorial = %ld \n",num,fact(num));
	}
		printf("Enter a value in the range 0-12(q to quit)");

  }
 printf("Bye.\n");
 return 0;
}
long fact(int n)
{
	long ans;
	for (ans=1;n>1;n--)
	{
		ans*=n;
	}
	return ans;
}
long rfact(int n)
{
	long ans;
	if (n>0)
	{
		ans = n*rfact(n-1);
	}
	else
		ans = 1;
	return ans;
}

以下是输出结果:
this program calculates factorials.
enter a value in the range 0-12(q to quit):
12
loop :12 factorial = 479001600
recursion:12 factorial = 479001600
Enter a value in the range 0-12(q to quit)

其实,在使用尾递归的场合使用循环更为合适,这样就可以不用开辟新的内存空间,减少内存使用率,从而提高性能。
但是递归在处理倒序时非常方便。我们来看以下这个问题:
编写一个函数,打印一个整数的二进制数,二进制表示法根据2的幂来表示数字。例如10进制数234实际上是101。
我们要设计一个以二进制方式来表示整数的方法或算法。

#include <stdio.h>
void to_binary(unsigned long n);
int main(void)
{
    unsigned long number;
	printf("Enter an integer(q to quit):\n");
	while(scanf("%lu",&number)==1)
	{
		printf("Binary equivalent:");
		to_binary(number);
		putchar('\n');
		printf("Enter and integer (q to quit):\n");
			
	}
	printf("Done.\n");
	return 0;
}

void to_binary(unsigned long n)
{
 int r;
 r = n % 2;  //将n除2,相当于去掉一个二进制的位。
 if (n>=2)
 {
	to_binary(n/2);  
 }
 putchar(r==0 ? '0':'1'); //如果是0,输出0字符,如果不是,输出1字符

 return 0;

 }

以上程序可以实现输入任意长度在unsigned long类型范围内的数,输出其对应的二进制数。
Enter an integer(q to quit):
14234
Binary equivalent:11011110011010
Enter and integer (q to quit):

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值