R1 Lecture 05 Class Notes

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=1diWi

d18=(12s)mod11

其中 Wi di 对应的权重

Digits: d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17
Weights:7910584216379105842

通过以上信息,写一个程序,从输入的前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

第五周作业

1.写一个函数, 输入18位身份证,输出是否通过检验

2.写一个函数 primeN 寻找N以内的素数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值