摘要:R语言的知识体系并非语法这么简单,如果都不了R的全貌,何谈学好R语言呢。本文将展示介绍R语言的知识体系结构,并告诉读者如何才能高效地学习R语言。

最近遇到很多的程序员都想转行到数据分析,于是就开始学习R语言。总以为有了其他语言的编程背景,学习R语言就是一件很简单的事情,一味地追求速度,但不求甚解,有些同学说2周就能掌握R语言,但掌握的仅仅是R语言的语法,其实这只能算是入门。

R语言的知识体系并非语法这么简单,如果都不了R的全貌,何谈学好R语言呢。本文将展示介绍R语言的知识体系结构,并告诉读者如何才能高效地学习R语言。

1. R的知识体系结构

R语言是一门统计语言,主要用于数学建模、统计计算、数据处理、可视化 等几个方向,R语言天生就不同于其他的编程语言。R语言封装了各种基础学科的计算函数,我们在R语言编程的过程中只需要调用这些计算函数,就可以构建出面向不同领域、不同业务的、复杂的数学模型。掌握R语言的语法,仅仅是学习R语言的第一步,要学好R语言,需要你要具备基础学科能力(初等数学,高等数学,线性代数,离散数学,概率论,统计学) + 业务知识(金融,生物,互联网) + IT技术(R语法,R包,数据库,算法) 的结合。所以把眼光放长点,只有把自己的综合知识水平提升,你才真正地学好R语言。换句话说,一旦你学成了R语言,你将是不可被替代的。

1.1 R的知识体系结构概览

R的知识体系结构是复杂的,要想学好R,就必须把多学科的知识综合运用,所以最大的难点不在于语言本身,而在于使用者的知识基础和综合运用的能力。

首先,从宏观上让我们先看一下R的知识体系结构的全貌,然后再分别解释每个部分的细节。


注:此图仅仅是我对R语言的理解,不排除由于个人阅历有限,观点片面的问题。

图中我将R语言知识体系结构分为3个部分:IT技术 + 业务知识 + 基础学科。

  • IT技术:是计算时代必备的技术之一,R语言就是一种我们应该要掌握技术。
  • 业务知识:是市场经验和法则,不管你在什么公司,都会有自己的产品、销售、市场等,你要了解你的公司产品有什么,客户是谁,怎么才能把产品卖给你的客户。
  • 基础学科:是我们这十几年在学校学的理论知识,当初学的时候并不知道是为了什么,毕业后如果你还能掌握一些知识并实际运用,那么这将是你最有价值的竞争力。

每个部分知识单独看都有其局限性,但如果能把知识两两结合起来,就构成了我们现在社会的各种技术创新点。

  • IT技术+业务知识:创造了阿里巴巴的电子商务帝国,腾讯全生态链的社交网络。
  • IT技术+基础学科:创造了Google搜索的神话,华尔街金融不败的帝国。

当然,R语言只是一门计算机语言技术,不能独自承担改写历史的重任,但R语言确实给了我们很大的想像空间,让我们能动手去了解这个世界的规律,找到无穷无尽的交叉点,创造出新的帝国。

如果你和我一样,都能站在这个角度来学习和使用R语言,那么我们一定可以成为并肩向前的同路人。欢迎加入我的团队,我们正在努力改变着未来。

1.2 R语言基础的知识

蓝图总是宏大和美好的,具体落实也将是困难重重的。接下来,我将会梳理思路,把所有的知识点对应到可操作的文档上,希望帮助大家掌握R语言的全貌!

R语言基础的知识,包括R语言的语法,R语言核心包的使用,R语言的内核编程,R语言包的开发,以及R语言的虚拟机。

1.2.1 R语言的语法

语法是我们了解R语言的第一步,和所有人一样,我也在很短的时间就适应R的语法规则,数据结构,基本类型,常用函数等等。但其实R的语法上坑,远比你知道的多得多。

我举个例子,看谁能准确的回答。比如,最基础的符号操作 “=”、“<-”、“<<-” ,三者有什么区别,分别在什么时候用?不要偷偷说问题太偏了,实际根本用不到。我的代码里处处都在用这3个符号,只是你不知道而已。在学习R的时候,不要用已经掌握的C、 Java、Python的经验直接去套R的语法,掉坑里的就是这些人。要重头开始学,一路上没有捷径。

R语言是函数式语言,语法自由,命名自由,使用简单,这只是对于普通用户来说的。作为一个有理想的极客,怎么能只停留在语法上呢!R是完全面向对象的,你了解什么是面向对象吗?R的面向对象打破了R原有的自由,但又要兼容原有的自由语法,多么纠结的设计啊,你能体会到吗?并不是记住了R的语法,就代表掌握了R语言。里面种各坑,只有自己踩了,再自己爬出来,才是真正的成长。

1.2.2 R语言核心包的使用

R语言同其他语言一样,在软件启动时,为我们提供了7个核心包,包括了众多的基础函数,如 数学计算函数,统计计算函数,日期函数,包加载函数,数据处理函数,函数操作函数,图形设备函数等。通过search()函数,可以查看到R启动时默认加载7个核心包。

> search()
[1] ".GlobalEnv" "package:stats" "package:graphics"
[4] "package:grDevices" "package:utils" "package:datasets"
[7] "package:methods" "Autoloads" "package:base"

这7个核心包,就是我们构建复杂模型的基础。由于这几个核心包比较底层,很多函数都是用C语言封装的没有R的源代码,而且除了官方文档,几乎没有其他更详细的文档介绍,所以这几个核心包就是学习的门槛,不要觉得某些函数会用了就行了,背后还有更深一层意义。

再问个问题,R的所有操作都是函数操作,那么“a<-1:10” 语句会被解析对应什么函数?

> a<-1:10;a
[1] 1 2 3 4 5 6 7 8 9 10

答案是,"1:10"对应"seq()“,”<-“对应assign()。

> assign('b',seq(1:10));b
[1] 1 2 3 4 5 6 7 8 9 10

掌握这种对应关系的意义在于,因为R是解释型语言,我们可以通过传递一个函数A的句柄,让其他的函数B动态调用这个函数A,这就是动态语言中的闭包特性的使用思路。在Javascript中,已经被广泛使用了,但在R语言中,却只有核心包的一些函数在使用这种语法。在R语言中,这种需要有计算机背景知识的地方还有很多,特别是在考虑如何提升R性能的部分。所以,不要太轻易就说自己掌握了R语言,多想想如何才能把其他语言的基础带到R语言的世界里。

1.2.3 R语言的内核编程

R语言的内核编程,又是一个比较复杂的计算机学科的问题。R的内核编程应该包括哪些内容呢,除了刚才说的R的语法和R的核心包,还有面向对象编程,量向化计算,特殊数据类型,环境空间等。我的第二本书《R的极客理想-高级开发篇》将会重点介绍这部分的内容。

面向对象编程,是一种对现实世界理解和抽象的方法,主要用于解决复杂问题的设计及实现。在Java的世界里,从2003年开始我接触Java的时候,社区就已经在聊面向对象的程序设计了。对于R语言来说,直到2011年发布的2.14版本,才最终有了RC类型的面向对象实现。面向对象的成熟,标志着R已经具备了构建复杂大型应用的能力,但如何真正地把面向对象用好,似乎也并不是统计人擅长的。有能力写出像Hadley Wickham面向对象代码的人,在R的圈子里,实在是极少数的。

量向化计算,是R语言特有的一种并行计算方式。在R中,向量是R的基本数据类型(vector),当你对一个向量进行操作时,程序会对向量中每个元素进行分别计算,计算结果以向量的形式返回。比如,最常见的两个等长的向量相加。

> 1:10+10:1
[1] 11 11 11 11 11 11 11 11 11 11

向量化计算,在R中有很广泛的应用场景,基本可以取代循环计算,高效的完成计算任务。我们定义两个向量,先相加再求和,run1()函数用向量化计算实现,run2()用循环方法实现。

> a<-1:100000
> b<-100000:1 > run1<-function(){ # 向量化计算
+ sum(as.numeric(a+b))
+ } > run2<-function(){ # 循环计算
+ c2<-0
+ for(i in 1:length(a)){
+ c2<-a[i]+b[i]+c2
+ }
+ c2
+ } > system.time(run1())
用户 系统 流逝
0 0 0 > system.time(run2())
用户 系统 流逝
0.14 0.00 0.14

通过运行程序,我们可以清楚地看出,向量化计算要比循环快。当算法越复杂数据量越大的时候,计算的时间差距会越明显的。R的编程中的一条法则就是用向量计算代替所有的循环计算。

特殊数据类型,R语言中除了那些基本的数据类型,还有一些高级的数据类型,并不是不常用,而是你不知道。

S3类型,S4类型,RC类型分别对应R语言支持的三种面向对象编程的数据结构。

环境类型(environment),由内核定义的一个数据结构,由一系列的、有层次关系的框架(frame)组成,每个环境对应一个框架,用来区别不同的运行时空间(scope)。

可能还有我不知道的类型…(请发现的同学通知我!)

环境空间,在进行R包开发时,是必备的一个知识点。每个环境空间都是环境类型的一个实例。每个R包都会被加载到一个环境空间中,形成有层次关系的、可调用的空间结构。

我们定义的函数和变量,都会存在于R的环境空间中,通过ls()就可以看到当前环境空间中的这些变量,比如,刚才量向化计算定义的变量和函数。

除了我们自己定义的变量和函数,环境空间中还有很多其他的变量和函数,比如sum(), length(), system.time()等,这些函数我们可以直接使用,但是它们并不在当前环境空间中,所以直接用ls()是查看不到的。当我们切换到base的环境空间时,就可以找到sum()的函数定义了。

>ls(pattern="^sum$",envir=baseenv())
[1] "sum"

R语言内核编程,如同其他语言一样,有很多的知识细节,并不是只有我提到的这几点。但由于缺少文档,同时R核心技术的不普及,所以知道的人就不多,会用的人更少。我也在每天探索,期待发现更多的秘密。

1.2.4 R语言包的开发

R包的开发,是R语言编程中比较难的,又不得不面对的问题,不仅要把上文中所提到的各种R语言技术综合运用在一起,还要符合R包的开发规范,并用Latex写好文档,最后提交给CRAN发布。技术问题虽然难,花时间还是可以解决的,但想要在CRAN上发布,那就只能用“难于上青天”来形容了。R语言发展了20多年,只有5000多个包在CRAN上发布,审核不是一般严格啊!我写的gridgame游戏包和chinaWeather天气包,改了很多次,都没能通过,都到了要放弃的边缘了。

换个角度想,只有审核严格才能保证用户在安装第三方的R包时候不会出错。由于CRAN的审核过于严格,Hadley Wickham也受不了了,又开发了devtools包,不仅提供了简化R包的开发的工具函数,还支持Github社区发布。这样就可以脱离CRAN的束缚,以个人的名义发布各种奇思妙想的R包,甚至是“不误正业”的R包。嘿嘿!!

1.2.5 R语言的虚拟机

终于到我不熟悉话题了,已我3年多R语言使用经验来说,还碰不到R语言的虚拟机。不过,网上看到很多高手在生产环境都会重新编译R软件,比如 用OpenBLAS加速R的矩阵运算,在虚拟机层实现矩阵的并行化计算,也有用GPU实现矩阵并行计算的;还有牛人把R实现的各种算法,都用C++重新实现,然后通过Rcpp封装,直接与R的虚拟机进行连接调用。

我看着各种大神走远不送了,希望他们把虚拟机优化好了,免费发布个补丁包什么的。

1.3 R语言的第三方包

R语言的第三方包,主要包括了在CRAN上的5000多个第三方包,以及其他社区的R包,这些包在各种领域中都发挥着重要的作用。在《R的极客理想-工具篇》一书中,我介绍了30多个包的使用,包括 时间序列包(zoo、xts、xtsExtra),性能监控包(memoise、profr、lineprof),R跨平台通信包(Rserve、Rsession、rJava), R服务器包(Rserve、RSclient、FastRWeb、Websocket),数据库访问包(RMySQL、rmongodb、rredis、RCassandra、RHive)、Hadoop操作包(rhdfs、rmr2、rhbase)等。

还有很多常用的包,比如 数据处理包(lubridate、plyr、reshape2、stringr、formatR、mcmc),机器学习包(nnet、rpart、tree、party、lars、boost、e1071、BayesTree、gafit、arules),可视化包(ggplot2、lattice、googleVis),地图包(ggmap、RgoogleMaps、rworldmap) 等。

R语言对于金融也有很好的支持,时间序列包(zoo、xts、chron、its、timeDate)、金融分析(quantmod、RQuantLib、portfolio、PerformanceAnalytics、TTR、sde、YieldCurve)、风险管理(parma、evd、evdbayes、evir、extRemes、ismev) 等。同时,我正在量化投资的创业中,R语言作为是系统架构中的算法引擎在最核心的位置,R正在承担着最有价值的业务,在后续的《R的极客理想-量化投资篇》一书中,我将会完整的介绍R语言在我的量化投资系统中的运用。

1.4 数学的基础知识

数学的基础知识,主要包括初等数学,高等数学,线性代数,概率论,统计学等。我们曾在大学中学过的各种数学,那些不知道有什么用,只为考试而学的数学,是能真正决定R语言掌握深度的基础知识。

当R语言普及以后,变成大众话的编程语言,入门会越来越容易,第三方包的调用会越来越简单,最后就是拼基础学科功底了,数学就是对所有人来说最难的基础学科。

  • 初等数学,中国人一直都在强调数学是我们的优势,比老外强很多,其实强的部分仅限于初等数学,加法口诀和乘法口诀让我们可以口算100以内的四则运算。
  • 高等数学,大学里挂科最多的一门课,那种照本宣科的教学方法,完全不知所谓。至到遇到了R,我才恍悟 为什么最小二乘法能进行最优化的计算。重新捡起高数,是学R的必经之路。
  • 线性代数,直到读完了Google的PageRank论文的N年后,自己才想明白,原来矩阵可以处理海量数据的计算,实现分步式算法与单机算法的一致性。
  • 概率论,通过R语言进行各种分步的随机实验,并利用概率密度曲线函数应用到实际的业务中,才让我理解概率才是可以衡量客观事件发生的指标。
  • 统计学,通过R语言我们可以很简单的构建各种统计模型,利用Bayes分别器判断垃圾邮件,利用回归模型预测未来的房价。

是R语言能让我切身地感受到,数学的基础知识在我们实际生活中的运用;也是R语言拉近了学术界和工业界的距离。如果能把我们从小到大学到的知识串起来,我想每个人都会具备与众不同的知识结构,将会在各行各业实现伟大的创新。

1.5 业务知识

业务知识涉及的面非常广,每个人都应该具备自身所处行业的知识,并结合R语言擅长的领域,发现新的机会。R语言擅长的领域包括 统计分析、金融分析、数据挖掘、互联网、生物信息学、生物制药、全球地理科学、数据可视化等。

我在软件和互联网行业呆了8年,亲身经历了两个行业的高速发展和变迁。技术一波又一波,每年都有新的主题,一路跟下来的人越来越少,虽然新鲜的血液不断补充着,但能力和经验却远达不到要求,被市场的浮躁扰动着。近些年,中国的创业公司的成功,少有技术创新,大都是商业模式创新和资本运作的成功。

面对着中国资本市场,掌握好业务的知识,就是找到了赚钱的法宝。当业务成熟,在大家都懂得游戏规则后,竞争就会变得异常激烈了,像电商,团购,旅游,酒店,游戏 都是如此。新领域新业务,才是值得80后90后年轻人奋斗的方向。如火如荼的O2O、互联网金融、物联网、机器人,也许正是明年的爆发点。如果你又懂技术又懂业务,学习又好,你将是下一个帝国的创造者。

1.6 跨学科的综合运用能力

再次强调,只要把多种学科的知识综合运用,不仅成为R语言的一代高手,更能实现自我的价值。

  • 当IT技术与业务知识完美结合,你会在新兴的市场的找到机会。一旦市场成熟后,业务竞争就会变成资本竞争,机会将不复存在。
  • 当IT技术与基础学科相结合,你可以通过科技创新,建立技术壁垒,保持技术优势直到成为行业老大。
  • 当IT技术、业务知识、基础学科,三者同时具备时,那么你将是不可被替代的。只要找到属于你的团队,研发出自己的产品,推广给你的用户,你就已经成功了!

R语言可以从IT的角度,帮助你实现成功,同时你的成功也将是R语言的成功!

2. R语言学习

花了很大的篇幅,终于把我理解的R语言知识体系解释清楚了,写着写着都快跑题了。那么接下来,我们应该如何高效的学习R语言呢?有句话要说在前头,学习是艰苦的,没有捷径可言,如果你想成功,那么更要面对苦中之苦。正确的学习方法,可以让我们少走弯路,学习别人的经验,会让我们加速成长。

通过上文中对跨学科知识体系的描述,我想大家都应该明白了,要想学好R,最大的难点不在于语言本身,而在于使用者的知识基础和综合运用的能力。当然,综合运用是要以良好的基础知识为前提的,先抛开业务知识和基础学科的知识不说,只谈IT技术,应该要掌握哪些知识呢?

2.1 IT基础知识

对于R语言本身来说,我们需要掌握R语言基础的知识,包括R的语法,R核心包的使用,R的内核编程,R包的开发,以及业务相关R的第三方包的使用。

如果你在学习R语言之前,已经有了很多的Java, Python等编程语言的经验,那么这将帮助你能很快熟悉R语言,你需要再补充一些数据分析和数据挖掘算法的知识,就能马上用在实际的工作中了。

如果你之前是SAS或Matlab数据科学家,那你只需要熟悉R的编程语法和第三方R包,就能用R来完成SAS和Matlab的所有任务。

如果是BI程序员,平时工作经常有处理数据和可视化的任务,那么你可以边学R边补充一些统计的知识,从无味ETL过程中发现数据的价值。

如果你是一名在读的统计学生,R语言将帮助你把书本上枯燥知识程序化,在学习过程中,就能发现社会的规律。

如果你一直在用Excel并抱怨功能远远不够的时候,试一下R语言,你的想法很快就会变成你财富的源泉。

如果你是一名宽客(Quant),还不懂R语言的话,那么你很快就会被市场淘汰的。

如果你是一名Hadoop算法工程师,用Java写一个MR算法通常要好几千行,你可试试用RHadoop,十分之一的代码行就可以完成同样的事情。

R语言可以与各种技术、各种思路相结合,让R语言和你已掌握的知识进行碰撞,你就会变得和别人不一样。

2.2 R语言中文图书

记得 邓一硕 写过一篇”R语言书籍的学习路线图“的文章,很有参考意义。文章分别介绍了R语言的初级入门、高级入门、绘图与可视化、计量经济学、时间序列分析和金融等内容,涉及到30多本R语言图书和小册子,但大部分是英文的。

随着时间的推移,这两年R语言又增加了好多本新书,中文图书也慢慢地多了起来。对于不同层次的R语言用户,也有了市场细分。入门的朋友可以从《R语言编程艺术》开始学习;有一定R的基础的朋友可以阅读《R语言实战》;需要扩展知识面的朋友可以阅读《R的极客理想-工具篇》;在掌握了各种R的入门技术后,高级的R语言开发者可以阅读《R的极客理想-高级开发篇》(即将出版);用R做可视化的朋友,可以阅读《ggplot2:数据分析与图形艺术》;正在学习统计学的朋友,可以阅读《统计建模与R软件》;准备用R做金融的朋友,可以阅读《时间序列分析及应用(R语言)原书第2版》和《金融数据分析导论(基于R语言)》。

以上推荐的图书,笔者都亲自读过,予以品质保证。此图书列表将不定期更新,把我读到的好书分享给大家!

2.3 R语言中文社区

除了图书,中文的R语言社区和个人博客也在蓬勃发展。

  • 统计之都,中国大陆最权威的R语言组织,不仅积累了大量高质量的R语言文章,并主办了七届中国R语言会议。统计之都团队成员,还参与翻译了《R语言编程艺术》、《R语言实战》、《ggplot2:数据分析与图形艺术》、《R语言核心技术手册(第2版)》、《R数据可视化手册》、《R语言统计入门(第2版)》等多本图书。
  • 炼数成金论坛,以数据分析为主题,设有R语言板块,提供在线的R语言入门培训,黄志洪老师算法讲解超一流。
  • 人大经济论坛,以经管教育为主题,设有R语言板块,以线下培训为主。
  • CSDN:以线上培训以及实战经验为主。

2.4 R语言中文博客

最后,祝大家把R语言学好用好,在各自的领域中找到创新的突破口,实现自我价值,然后反馈给R语言社区,加速R的壮大发展。

3. 作者介绍

张丹,程序员、架构师,创业者。我的博客: http://blog.fens.me。个人著作:《R的极客理想》系列图书。

从程序员开始,到架构师一路走来,经历过太多的系统和应用。做过手机游戏,写过编程工具;做过大型Web应用系统,写过公司内部CRM;做过SOA的系统集成,写过基于Hadoop的大数据工具;做过外包,做过电商,做过团购,做过支付,做过SNS,也做过移动SNS。以前只用Java,然后学了PHP,现在用R和Node。最后跳出IT圈,进入金融圈,研发量化交易软件。

注:本文将做为《R的极客理想-高级开发篇》一书的开篇文章。

原文地址:R语言知识体系概览

【转】R语言知识体系概览的更多相关文章

  1. R语言-记号体系

    安装xlsx包 #装之前先装jdk,配置环境变量 install.packages("xlsx") 代表安装成功 必须先加载包然后再使用包library() $提取符号 当一个函数 ...

  2. C语言知识体系

    吾尝终日而思矣,不如须臾之所学也: 吾尝跂而望矣,不如登高之博见也. 登高而招,臂非加长也,而见者远: 顺风而呼,声非加疾也,而闻者彰. 假舆马者,非利足也,而致千里: 假舟楫者,非能水也,而绝江河. ...

  3. Rserve详解,R语言客户端RSclient【转】

    R语言服务器程序 Rserve详解 http://blog.fens.me/r-rserve-server/ Rserve的R语言客户端RSclient https://blog.csdn.net/u ...

  4. R语言中文社区历史文章整理(类型篇)

    R语言中文社区历史文章整理(类型篇)   R包: R语言交互式绘制杭州市地图:leafletCN包简介 clickpaste包介绍 igraph包快速上手 jiebaR,从入门到喜欢 Catterpl ...

  5. 《R语言实战》读书笔记--为什么要学

    本人最近在某咨询公司实习,涉及到了一些数据分析的工作,用的是R语言来处理数据.但是在应用的过程中,发现用R很不熟练,所以再打算学一遍R.曾经花一个月的时间看过一遍<R语言编程艺术>,还用R ...

  6. python3调用R语言干货

    R语言知识:https://www.w3cschool.cn/r/r_lists.html 1. 安装库rpy2 1. 下载与本地对应python版本模块,pip install rpy2是安装不上的 ...

  7. R语言实现Xbar-R控制图

    R语言实现Xbar-R控制图 Xbar-R控制图在质量管理中主要用于对计量数据进行检测,以达到控制对象质量的目的. 虽然用Excel可以轻松实现控制图的操作,不过作为R软件初学者,我试着用仅有的一点R ...

  8. R语言结合概率统计的体系分析---数字特征

    现在有一个人,如何对这个人怎么识别这个人?那么就对其存在的特征进行提取,比如,提取其身高,其相貌,其年龄,分析这些特征,从而确定了,这个人就是这个人,我们绝不会认错. 同理,对数据进行分析,也是提取出 ...

  9. R语言学习笔记:基础知识

    1.数据分析金字塔 2.[文件]-[改变工作目录] 3.[程序包]-[设定CRAN镜像] [程序包]-[安装程序包] 4.向量 c() 例:x=c(2,5,8,3,5,9) 例:x=c(1:100) ...

随机推荐

  1. air游戏接入小米支付sdk

    小米支付sdk要求在Application.onCreate中进行初始化 为了这个初始化搞了半天,最终搞定了.今天将更改的步骤记录下了. 1. 创建ANE.ANE的创建就不罗嗦了,这里须要注意一点,这 ...

  2. 线程管理coroutine

    非常好用的协程库,也可以当作线程管理来用 #include "coroutine.h" #include <stdio.h> struct args { int n; ...

  3. PAT 1144 The Missing Number[简单]

    1144 The Missing Number(20 分) Given N integers, you are supposed to find the smallest positive integ ...

  4. PHP程序执行时间过长,超时了怎么办

    解决办法:修改php.ini文件,把最大的执行时间改为0,0表示不限制时间. max_execution_time = 0

  5. (转)C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

    程序在内存有五个存在区域: A:动态区域中的栈区  B:动态区域中的栈区 C:静态区域中:全局变量 和静态变量    (这个区域又可以进一步细分为:初始化的全局变量和静态变量    以及    未初始 ...

  6. XDU 1111

    对于一排n个正方形,有f(n)种方案达成目标,若第n个块是白色,则有f(n-1)种方案,若第n个块是黑色,则第n-1个块必为白色,那么有f(n-2)+n-2种方案. 则f(n)=f(n-1)+f(n- ...

  7. 97. Interleaving String(字符串的交替连接 动态规划)

    Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given:s1 = ...

  8. Pivot 和 Global 的一些总结

      相信大家一定有在 Unity 編輯器上看到這樣功能 這邊會跟大家說明這項功能有什麼用處     Pivot  意思為,輔助編輯的工具標示,會顯示在第一個選取的物件身上. Center 意思為,輔助 ...

  9. Java HashMap详细介绍和使用示例

    ①对HashMap的整体认识 HashMap是一个散列表,它存储的内容是键值对(key-value)映射. HashMap继承于AbstractMap,实现了Map.Cloneable.java.io ...

  10. IDEA 2018.2破解

    最新的IDEA激活方式 使用网上传统的那种输入网址的方式激活不了,使用http://idea.lanyus.com/这个网站提供的工具进行 1.进入hosts文件中:C:\Windows\System ...