C语言程序小思考

[复制链接]
查看11 | 回复2 | 2011-7-26 11:32:38 | 显示全部楼层 |阅读模式
今天看了递归的思想,写了一个用递归方法求n!的程序(程序1),又写了一个用for循环求n!的程序(程序2),个人认为两者的效率没有实质性的差别,代码的复杂程度也相同,我对计算机编译原理不是很熟悉,这两个程序正的像我想象的那样吗?他们有什么区别,哪个更有优势,有点在哪里,什么情况递归适用,什么情况for适用。请大家帮我看看。
代码如下(程序已经编译运行成功)
程序1
#include
int main()
{
        int factorial(int n);
        int n;
        char cExit;
        while(1)
        {
        printf("请输入n的值!\n");
        scanf("%d",&n);
        printf("%d的阶乘为%d\n",n,factorial(n));
        printf("按任意键继续,退出请按'x'\n");
                cExit=getchar();
                cExit=getchar();
        if(cExit=='x'||cExit=='X')
                break;
        }
        return 0;
}
int factorial(int n)
{
        int a;
        if(n1)
        a=factorial(n-1)*n;
                         return a;
}
程序2
#include
int main()
{
        int n,p,i;
        char cExit;
        while(1)
        {
        p=1;
        printf("请输入n的值!\n");
        scanf("%d",&n);
        if(n<0)
                {
                printf("输入的数据有误!\n");
                break;
                }
        else if(n==0||n==1)
                p=1;
                else
                        for(i=2;i<=n;i++)
                        p=p*i;
        printf("n!=%d\n",p);
        printf("按任意键继续,按x退出!\n");
        cExit=getchar();
        cExit=getchar();
        if(cExit=='x'||cExit=='X')
        break;
        }
        return 0;
}

回复

使用道具 举报

千问 | 2011-7-26 11:32:38 | 显示全部楼层
递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等...
回复

使用道具 举报

千问 | 2011-7-26 11:32:38 | 显示全部楼层
求这种n!的情况两种算法速度差不多,递归稍稍慢一点点(因为有堆栈时间消耗)如果是求类似斐波那契数或者是组合数的时候,递归就慢非常多了,因为涉及到重复运算的无用时间。详细原理看算法的书籍...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行