2015-11-23 52 views
1

为什么我们不能直接在main中使用它?
为什么要递归?为什么用递归找到数的阶乘?

#include<stdio.h> 
int factorial(int n); 
int main() 
{ 
    int n; 
    printf("Enter an positive integer: "); 
    scanf("%d",&n); 
    printf("Factorial of %d = %ld", n, factorial(n)); 
    return 0; 
} 

int factorial(int n) 
{ 
    if(n!=1) 
    return n*factorial(n-1); 
} 
+4

您不必使用递归。这是计算阶乘的一种方法。你也可以使用循环来做同样的事情。 –

+0

你说得对,计算阶乘时不应该有任何递归。不幸的是,这是可以演示递归的最简单的例子之一,因此教师经常会为此付出代价,而没有声明不应该在这种情况下使用递归。 – dasblinkenlight

+1

n == 1时该怎么办? – Michi

回答

4

您不必使用递归。因为C不支持所谓的尾递归的优化要求,你应该避免递归它可以通过一个简单的循环来替代。但是C不支持递归在所有,这样的阶乘是递归函数的simpliest例子,如果我们不注重事实,这是不是最优的代码。

递归最简单的用例,它实际上是需要可能是一个目录树循环。如果你试图在后一种情况下用循环替换递归,你将得到更少的可读代码,并且你仍然需要一个带有O(N)内存的堆栈,其中N是最大目录嵌套层次,所以在大多数情况下,你不会从这个优化尝试中获得任何有用的东西。

此外,还要注意一个事实,即香草C不内置支持动态数据结构。你可以,当然,使用通过malloc()realloc()free() C运行时库的函数访问堆内存实现可变大小的堆栈,但这种方法会增加项目的复杂程度。你将不得不照顾你的指针,以避免泄漏和内存损坏。

+0

有趣的历史说明:递归支持是的C'S大卖点之一,它正在开发的时间(当然,实际上它仍然是B中这一点)的显着特点,特别是因为人们想写功能于一身的“多数学“风格。 C的历史竞争者Fortran多年来不会支持它。三元运营商也是如此。 – Leushenko

+0

@Leushenko我从来没有用过Fortran的,但是从这个语言知道它总是在科学计算中广泛使用multidimesional阵列的支持ovewhelming优势,它不会从指针别名问题的困扰,所以它是很容易在编译器中执行积极的优化。而且还有所有这些IBM专利。 –

+0

是的。一个相关的历史怪癖是,B和C从未打算成为C和C++今天已经成为的高性能野兽 - 它们用于编写“高级”代码,它需要的不仅仅是优化的清晰性和可移植性(B甚至开始生活为一种解释性语言)。 – Leushenko