这里为什么把递归列出来呢?
个人觉得递归的思想比较重要
C语言允许一个函数调用其本身,这种调用过程被称为递归(recursion)。当一个函数调用自己时,如果编程中没有设定可以终止递归的条件检测,它将会无限制地进行递归调用,所以需要进行谨慎处理。
递归一般可以代替循环语句使用。有些情况下使用循环语句比较好,而有些时候使用递归更有效。递归虽然使程序结构优美,但其执行效率却没有循环语句高。
每一级的函数调用都有自己的变量。
每一次函数调用都会有一次返回。当程序流执行到某一级递归的结尾处时,它会转移到前1级递归继续执行,即逐级返回。
递归函数中,位于递归调用前的语句和各级被调函数具有相同的执行顺序。
递归函数中,位于递归调用后的语句的执行顺序和各个被调函数的顺序相反。
递归函数中必须包含可以终止递归调用的语句。通常情况下,递归函数会使用一个if条件语句或其他类似的语句以便当前函数参数达到某个特定值时结束递归调用。
小结
最简单的递归形式是把递归调用语句放在函数结尾,即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, rfact(num));
}
printf("Enter a value in the range 0-12 (q to quit):\n");
}
printf("Bye.\n");
return 0;
}
long fact(int n) // loop-based function
{
long ans;
for (ans = 1; n > 1; n--)
ans *= n;
return ans;
}
long rfact(int n) // recursive version
{
long ans;
if (n > 0)
ans= n * rfact(n-1);
else
ans = 1;
return ans;
}