#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):