R1 Lecture 05 Class Notes
by YU,Xiang
Mar 31 2015
简单编程
前N个数的平方和
# 用 for 循环的做法
f1 <- function(N){
s <- 0
for(i in 1:N){
s <- s+i^2
}
s
}
# 用 while 循环的做法
f2 <- function(N){
s <- 0
x <- 1
while(x <= N){
s <- s+x^2
x <- x+1
}
s
}
# 向量化思想
f3 <- function(N){
x <- 1:N
as.vector(t(x) %*% x)
}
# R基础运算可以自动向量化
f4 <- function(N){
x <- 1:N
sum(x^2)
}
# 速度测试
system.time(f1(1000000))
## user system elapsed
## 0.7129999999999991900 0.0010000000000000009 0.7179999999998472049
system.time(f2(1000000))
## user system elapsed
## 1.2569999999999996732 0.0010000000000000009 1.2629999999999199645
system.time(f3(1000000))
## user system elapsed
## 0.0949999999999988631 0.0010000000000000009 0.0949999999993451638
system.time(f4(1000000))
## user system elapsed
## 0.012000000000000455 0.000000000000000000 0.012000000000625732
可以看出,R自带数学函数具有最高的效率,原因是其不但是向量化的,并且调用了更高效率的Fortran和C,所以比f3更高效
身份证号验证
Wikipedia上介绍了我国居民身份证的相关信息. 18位身份证最后一位 d18 为验证码,计算方法如下
S=∑17i=1di⋅Wi
d18=(12−s)mod11
其中 Wi 为 di 对应的权重
Digits: | d1 | d2 | d3 | d4 | d5 | d6 | d7 | d8 | d9 | d10 | d11 | d12 | d13 | d14 | d15 | d16 | d17 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Weights: | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 | 6 | 3 | 7 | 9 | 10 | 5 | 8 | 4 | 2 |
通过以上信息,写一个程序,从输入的前17位计算第18位
rid <- function(x){
x <- str2num(x)
w <- c(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2)
s <- t(x) %*% w
as.vector((12-s)%%11)
}
str2num <- function(str){
x <- strsplit(str,split="")
as.numeric(x[[1]])
}
# 测试
rid("33016219941212123")
## [1] 1