黑马程序员技术交流社区

标题: 这是两个求阶乘的代码,你们进来帮我理解一下呗 [打印本页]

作者: EYE_SEE_YOU    时间: 2013-8-4 13:36
标题: 这是两个求阶乘的代码,你们进来帮我理解一下呗
本帖最后由 EYE_SEE_YOU 于 2013-8-5 13:30 编辑

我先把书上的答案发出来:
public class test
{
        public static void main(String[]args)
        {            
                long limit =20;
                long factorial=1;
                for(int i =1;i<=limit;i++)
                {
                        factorial=1;
                        for(int factor=2;factor<=i;factor++)
                        {
                                factorial*=factor;
                        }
                                System.out.println(i+"!"+"is"+factorial);
                }
               
        }
}

喏,就是这个代码让我看不懂,下面这个是我自己理解出来的,运行结果是相同的:

public class test
{
        public static void main(String[]args)
        {            
                long limit=20;
                long factorial=1;
                for(int i=1;i<=limit;i++)
                {
                        int factor=1;
                        for(factorial=1;factor<=i;factor++)
                        {
                                factorial*=factor;
                        }
                        System.out.println(i+"! is "+factorial);

                }
               
        }
}
好了,那么第一个代码要怎么解读呢,完全弄不懂它的思维啊


作者: EYE_SEE_YOU    时间: 2013-8-4 13:52
那个啥,代码我是能看懂,就是他写着代码的思路自己不能领悟,他怎么能弄出个2来
作者: 李江    时间: 2013-8-4 14:00
public class test
{
        public static void main(String[]args)
        {            
                long limit =20;
                long factorial=1;
                for(int i =1;i<=limit;i++)
                {
                        factorial*=i;     
                        System.out.println(i+"!"+"is"+factorial);
                }

        }
}

你的书上怎么会那样写,变麻烦了不是。


作者: 李江    时间: 2013-8-4 14:02
EYE_SEE_YOU 发表于 2013-8-4 13:52
那个啥,代码我是能看懂,就是他写着代码的思路自己不能领悟,他怎么能弄出个2来 ...

从1开始和从2开始是一样的,就是少了一次乘1运算
作者: binghaiwang    时间: 2013-8-4 14:18
本帖最后由 binghaiwang 于 2013-8-4 14:48 编辑
  1.        for(int factor=2;factor<=i;factor++)
  2.                         {
  3.                                 factorial*=factor;
  4.                         }
复制代码
他这里的为什么写2  是因为  1的阶乘是1 ,所以他在循环里边就少算了1的阶乘运算,并且1乘以所有数字都是数字本身,所以factorial*=factor运算里边也不需要重复去乘以1了
作者: masterV    时间: 2013-8-4 14:22
  1. long limit=20;
  2. long factorial=1;
  3. for(int i=1;i<=limit;i++)
  4.     {
  5.          
  6.          factorial = 1;
  7.           for(int factor=2;factor<=i;factor++)
  8.           {
  9.                   factorial*=factor;
  10.           }
  11.            System.out.println(i+"! is "+factorial);
  12.     }
复制代码
这是一个嵌套for循环,第一次循环,内循环factor<=i条件不满足,不用执行循环体。说白了就是少循环一次,你的代码也挺好的。


作者: EYE_SEE_YOU    时间: 2013-8-4 19:32
原来是这样啊,直接省略乘1的运算,我会再研究研究这个方法的,谢谢上面哥儿几个啦




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2