//hereisanexceedinglycleverdeviceassortment.push(Math.round(assortment[tally-2]*artfulRatio));
}
//shouldtherebeanoverabundanceofelements,aremedyneedbeappliedreturnassortment.slice(0,enormity);
}
从代码中可以看出,他没有体会到斐波那契数列的基本理念,而是采用乘法解决。
代码里也有些有趣的命名,但缺乏核心地理解。
二、实现factorial(n)阶乘
以上是这些著名的作家用JavaScript编写斐波那契数列,下面再让我们看看,作家们是如何用JavaScript/CoffeeScript编写factorial(n)的。
1.杰克·凯鲁亚克(JackKerouac美国小说家)
代表作:
《在路上》《贩毒者》等
/*...theonlynumbersformearethemadones,takeforty-threelikea
steamenginewithatalkycabooseattheend*/n=43,
/*andthatlanky
fellowinacockedfedora*/r=1/*thenbacktoournumber,ourmad
number,madtobecomeone*/while(n>1)
/*madtodescend*/n--,
/*mad
tomultiply*/r=r*n
/*andattheend,youseethebluecenter-light
pop,andeverybodygoes1.4050061177528801e+51...*/r
上面代码只能返回43的阶乘,如果想要实现另一个数的阶乘,你还需重写代码。
不过,最值得注意地是,注释和代码几乎没有区别,无法分辨,从侧面反映了Kerouac的风格,很长、狂野和狂想式的流露。
2.塞缪尔·约翰逊(SamuelJohnson英国作家、诗人)
代表作:
《英语大辞典》《伦敦》《人类欲望的虚幻》等
#InwhichvariousNUMBERSaresummon'dby
#meansofELECTRONICKCONJURY
factorial=(n)->
#Allargumentisagainstit;yetallbeliefisforit
return1unlessn
#Ingenioussophistrytoprovethepalp'blyOBVIOUS
return1ifnis1#Recursion(n.)
#aprogramthatcalls'ponitselfinthemannerof
#adogreturninguntoitsVOMIT
returnn*factorialn-1
整段代码比较稀疏,中间也掺杂着Johnson的精言妙语:
其中,他也对factorial(0)应该为1进行了怀疑,他应该用一个完整的句子来表达factorial
(1)就是1,从其字典里进行推测,完成了一个具有讽刺定义的递归解除。
Johnson的整个解决方案充满着艺术和模仿的结合——带有整洁表达式地温和的自我嘲讽和真正美丽的混合。
3.詹姆斯·乔伊斯(JamesJoyce爱尔兰作家、诗人)
代表作:
《尤利西斯》
functionhacktorial(integette){
varnonthings=[undefined,null,false,0,'',NaN];
varresultution=1;
if(integette==0){
//beholdthestrangerouszeroine!
resultution=1;
}else{
while(integette>1)
//caligulatebymulticapablesresultution=resultution*integette--;
}
with(resultution){
varduodismal=Function('returnthis').call(toString(12));
vardisemvowel=Function("n","returnn?
parseInt(n,12):
'0'")
return[
disemvowel(duodismal.slice(0,-1)),
'shillingsand',
disemvowel(duodismal[duodismal.length-1]),'pence'].join('');
}
//klikkaklakkaklaskaklopatzklatschabattacreppycrottygraddahappluddyappladdypkonpkot!
}
Joyce不仅仅是解决了阶乘问题,前半部分代码已经解决了这个问题,但Joyce坚决把结果转换为当时的货币:
先令和便士。
结果:
hacktorial(3)
//"0shillingsand6pence"hacktorial(4)
//"2shillingsand0pence"hacktorial(7)
//"420shillingsand0pence"hacktorial(21)
//"4257578514309120000shillingsand0pence"
4.理查德·费曼(RichardFeynman美国物理学家)
代表作:
《费曼物理学讲义》《物理之美》
//usingRamanujan'sapproximationfunctionfractorail(n){
with(Math){
varr=sqrt(PI)*pow(n/E,n);r*=pow(8*pow(n,3)+4*(n*n)+n+1/30,1/6);
returnr;
}
}
费曼的工作的特点是具有大胆的创意和非常古怪的才华,从它所编写的这段代码中也能看出。
结果,不要担心一些“舍入误差”,如果你非常熟悉JavaScript,你就应该知道:
fractorail(3);
//6.00005fractorail(1.1);
//1.04671fractorail(5.2);
//169.40628
5.阿瑟·柯南·道尔(ArthurConanDoyle世界著名小说家)
代表作:
《福尔摩斯探案集》《失落的世界》
"usestrict";
//Insolvingaproblemofthissort,thegrandthingistobeabletoreasonbackwards...//somethingsareeasierknownthanexplained!
varcaseHistory=newObject({2:
2,6:
3});
functionunfactorial(evidence){
//first,humility!
if(evidence===1){
return"Watson,Iamataloss!
"}
//second,logicalprecedence!
if(caseHistory[evidence]){
//elementary!
returncaseHistory[evidence];
}
//third,eliminatetheimpossible!
if(evidence===0||evidence%24!
==0){
return"charlatans!
";
}
//fourth,deduction!
vartheDeduction,enumarator=evidence,denominator=1;
while(enumarator%denominator===0){
enumarator=enumarator/denominator++;if(enumarator===denominator){
theDeduction=enumarator;
}
}
theDeduction=theDeduction||"impostors";
//Whatonemancaninventanothercandiscover!
caseHistory[evidence]=theDeduction;
//Whatremains,howeverimprobable,mustbethetruth!
returntheDeduction;
}
正如大家想象的那样,柯南道尔的设计过程是精确和认真有序的,此外,大家可能注意到,他让其应用程序在strict模式运行——容不得半点马虎。
6.简·奥斯汀(JaneAusten英国小说家)
代表作:
《理智与情感》《傲慢与偏见》
factorial=(function(){
//Ideclare...varledger={};
returnfunctionreckoning(quantity){
if(isNaN(quantity)){
console.log("Ihavenotthepleasureofunderstandingyou");
return;
}
//Itisatruthuniversallyacknowledgedthattwovalues//canonlybeadjudgedtrulyagreeablebymeansof===if(quantity===0){
return1;
}
//MrCrockfordteachesthatwebewaryofinheritedproperty...if(ledger.hasOwnProperty(quantity)){
returnledger[quantity];
}
//Praypersistuntilananswerisfurnishedreturnledger[quantity]=quantity*reckoning(quantity-1);
};
})();
JaneAusten解决方案的亮点之一是代码工艺和结构的完整性,主要体现在代码块的整洁上,她调用模块模式,隐藏历史数据(或ledger)在上层结构的文件夹里;第二个则是体现了JaneAusten的俏皮,甚至是颠覆性的,对power的讽刺和荒谬的约定。
7.欧内斯特·海明威(ErnestHemingway美国小说家)
代表作:
《老人与海》《太阳照样升起》等
//Economy.functionfactorial(n){
returnn<2?
1:
factorial(n-1)*n;
}
代码足以说明一切。
我们从中所学到的
这些著名的小说家、诗人、戏剧家的伟大之处在于他们勇于开拓新方式,尝试新的技术并且打破我们一直所遵循的规律。
最优秀的英语作家具有着对规则的蔑视。
——StevenPinker
JavaScript作为最流行的编程语言之一,它的进步取决于开发者们地大胆创新、研究以及发现新模式,这样才能惠及更多的人。