2007年4月3日星期二

思维错误

一同学发一信息于我,让我帮忙拼好则return之,题为将如下22个字排成一句话:
想,恨,忍,真,我,爱,情,你,没,世,今,一,在,活,生,为,乐,有,好,快,过,不
 
由于当时手边没有计算机,也没有笔,便发信息让有计算机的朋友帮忙,让他写个程序,穷举出所有没有重复字的句子,然后读一遍,像人话的就记下来。
 
当时我想:
1个字只有一种可能,1一向比较特殊;
2个字只有2*(2-1)种可能;
3个字只有3*(3-1)种可能;
所有N个字"应该"是N*(N-1)中可能;
22个字穷举循环的时候可能要多一些,但是结果也就22*21=462个句子,应该不成问题。
 
朋友说"我靠,计算机肯定累死",然后附加了网上查到的一条比较像人话的(下面引用的第1条)。
 
第二天,我复习了下穷举法,写出22重循环,先是用Javascript演算,老是提示说"计算机将会变慢,是否继续"之类,烦。又写了一个部分效率较高但是需要高效率"智能随机"的算法雏形。未遂,换成Java继续演算,一个多小时动不敢动一下计算机。最后实在受不了就中断进程了。
 
发现Java系统类中没有提供阶乘算法,就用递归写了一个:
 
    public static long factorial(int number){
        if (number < 1 || number > 20){
            System.err.println("please using the integer " +
                "between 1 and 20.");
            return 0;
            //System.exit(1);
        }
        return number <= 1 ? 1 : number*factorial(number-1);
    }
 
如果不加输入判定,当输入值number大于20,则递归结果对long越界,结果为负值。
Math.factorial(22) = -1250660718674968576
用double则大数值则不够精确。
 
经过算法分析,发现我最初的推导是错误的。
1个字只有 1! 种可能;
2个字只有 2! 种可能;
3个字只有 3! 种可能;
所有N个字是 N! 中可能。
 
 
下面是搜索到拼得比较像人话的句子。
 
1、恨你在今生没有爱过我,真不忍为情活一世,好想快乐!
2、爱你,我真想快乐,不过没有,在今生一世为情忍活,好恨!
3、我为爱情没有活好,真不忍恨你一生,想在今世过快乐!
4、我好恨你,生活没有快乐,今世真不想为爱情忍过一生!
5、恨你在今生没有爱过我,为情活,真不忍,好想快乐一世!
 

没有评论:

发表评论