R 中的阶乘记忆化

2023-11-29

我编写这个函数来查找数字的阶乘

fact <- function(n) {
    if (n < 0){
      cat ("Sorry, factorial does not exist for negative numbers", "\n")
    } else if (n == 0){
      cat ("The factorial of 0 is 1", "\n")
    } else {
    results = 1
    for (i in 1:n){
      results = results * i
    }
    cat(paste("The factorial of", n ,"is", results, "\n"))
    }
}

现在我想在 R 中实现 Memoization。我对 R 有基本的想法并尝试使用它们来实现。但我不确定这是否是前进的方向。您能否也详细阐述一下这个主题。预先感谢。 记忆阶乘

    fact_tbl <- c(0, 1, rep(NA, 100))
    fact_mem <- function(n){
          stopifnot(n > 0)
          if(!is.na(fib_tbl[n])){
           fib_tbl[n]
    } else {
       fact_tbl[n-1] <<- fac_mem(n-1) * n
     }
   }

   print (fact_mem(4))

首先,如果您需要高效的实现,请使用 Rfactorial功能。不要自己写。然后,阶乘是理解递归的一个很好的练习:

myfactorial <- function(n) {
  if (n == 1) return(1)
  n * myfactorial(n-1)
}

myfactorial(10)
#[1] 3628800

对于此功能,只有当您打算重复使用该功能时,记忆才有用。您可以使用闭包在 R 中实现记忆化。哈德利在中解释了这些his book.

createMemFactorial <- function() {
  res <- 1
  memFactorial <- function(n) {
    if (n == 1) return(1)

    #grow res if necessary
    if (length(res) < n) res <<- `length<-`(res, n)

    #return pre-calculated value
    if (!is.na(res[n])) return(res[n])

    #calculate new values
    res[n] <<- n * factorial(n-1)
    res[n]
  }
  memFactorial
}
memFactorial <- createMemFactorial()

memFactorial(10)
#[1] 3628800

它实际上更快吗?

library(microbenchmark)
microbenchmark(factorial(10),
               myfactorial(10), 
               memFactorial(10))
#Unit: nanoseconds
#             expr  min     lq    mean median     uq   max neval cld
#    factorial(10)  235  264.0  348.02  304.5  378.5  2463   100 a  
#  myfactorial(10) 4799 5279.5 6491.94 5629.0 6044.5 15955   100   c
# memFactorial(10)  950 1025.0 1344.51 1134.5 1292.0  7942   100  b 

注意microbenchmark对函数求值(默认) 100 次。由于我们在测试时存储了 n = 10 的值memFactorial,我们在这里只对 if 条件和查找进行计时。您还可以看到,R 的实现(主要用 C 编写)速度更快。

一个更好(也更简单)的例子实现了斐波那契数。在这里,算法本身受益于记忆。

#naive recursive implementation
fib <- function(n)  {
  if(n == 1 || n == 2) return(1)
  fib(n-1) + fib(n-2)
}

#with memoization
fibm <- function(n)  {
  if(n == 1 || n == 2) return(1)

  seq <- integer(n)
  seq[1:2] <- 1

  calc <- function(n) {
    if (seq[n] != 0) return(seq[n])
    seq[n] <<- calc(n-1) + calc(n-2)
    seq[n]
  }

  calc(n)
}

#try it:
fib(20)
#[1] 6765
fibm(20)
#[1] 6765

#Is memoization faster?
microbenchmark(fib(20),
               fibm(20))
#Unit: microseconds
#     expr      min       lq       mean    median        uq       max neval cld
# fib(20)  8005.314 8804.130 9758.75325 9301.6210 9798.8500 46867.182   100   b
#fibm(20)    38.991   44.798   54.12626   53.6725   60.4035    97.089   100  a 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R 中的阶乘记忆化 的相关文章

  • 融化R中的下半矩阵

    如何融化下半三角形加对角矩阵 11 NA NA NA NA 12 22 NA NA NA 13 23 33 NA NA 14 24 34 44 NA 15 25 35 45 55 A lt t matrix c 11 NA NA NA NA
  • R 中按时间划分的平均值

    我每秒测量一次化合物浓度 我想求 30 秒和 60 秒的平均值 我一直在阅读这里的帖子 我尝试过lubridate and dplyr 但没有运气 我正在努力完成这项工作 但我一直没能做到 我正在从 SAS 过渡到 R 所以请耐心等待 这是
  • R 将多个值与向量进行比较并返回向量[重复]

    这个问题在这里已经有答案了 我有一个向量 A 对于 A 的每个元素 我想检查它是否等于第二个向量 Targets 中的任何元素 我想要一个逻辑值向量 其长度为 A 作为返回 也提到了同样的问题here http r 789695 n4 na
  • 无法更新/编辑从 R 中的包(`gratia`)导出的 ggplot2 对象

    我希望我在这里遗漏了一些令人痛苦的明显的东西 我希望更新 例如 修复标题 实验室等 由 生成的 ggplot 对象gratia draw 不太确定为什么我无法更新该对象 有一个简单的解决方案吗 devtools install github
  • 从 n,k 维矩阵数组中减去 n,k 维矩阵

    如果我有一个数组A A lt array 0 c 4 3 5 for i in 1 5 set seed i A i lt matrix rnorm 12 4 3 如果我有矩阵 B set seed 6 B lt matrix rnorm
  • 在 R 传单中添加不透明度滑块

    如何在 R leaflet 应用程序中添加滑块来控制特定图层的不透明度 对于这个应用程序 我不想使用闪亮 这里建议 在 R 传单应用程序中添加滑块 https stackoverflow com questions 37682619 add
  • 使用 R 下载压缩数据文件、提取和导入数据

    EZGraphs 在 Twitter 上写道 很多在线 csv 都被压缩了 有没有办法下载 解压缩存档并使用 R 将数据加载到 data frame Rstats 我今天也尝试这样做 但最终只是手动下载 zip 文件 我尝试过类似的东西 f
  • 尝试使用 JRI 将 R 与我的 Java 应用程序集成,但出现错误。谁能解释一下原因和解决办法吗?

    我需要将 Java 与 R 集成来运行一些数学命令并使用 R 的功能进行绘图 以下部分代码给出了错误 public static void main String args HelloRWorld r new HelloRWorld r h
  • R中的重叠矩阵

    我有以下数据框 id channel 1 a 1 b 1 c 2 a 2 c 3 a 我想创建并重叠矩阵 它基本上是一个方阵 行和列标签为 a b c 表中的每个条目显示每个通道共有多少个 id 例如 在上面的例子中 矩阵看起来像 a b
  • R - 计算 bin 中特定值的数量

    我有一个如下所示的数据框 df Value lt c 1 1 0 2 1 3 4 0 0 1 2 0 3 0 4 5 2 3 0 6 Sl lt c 1 20 df lt data frame Sl Value gt df Sl Value
  • 列出 R 数据文件的内容而不加载

    我有时用print load myDataFile RData 当我加载数据文件时列出它的内容 有没有办法列出内容而不加载数据文件中包含的对象 我认为如果不加载对象就无法做到这一点 解决方案可能是使用包装器将 R 对象保存到save 该函数
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 如何按用户定义(例如非字母顺序)对数据框进行排序[重复]

    这个问题在这里已经有答案了 给定一个数据框dna gt dna chrom start chr2 39482 chr1 203918 chr1 198282 chrX 7839028 chr17 3874 以下代码重新排序dna by ch
  • 将列表中的每个元素转换为数据框中的一列

    假设我有以下列表 d library combinat d permn c a b c 这看起来如下 1 1 a b c 2 1 a c b 3 1 c a b 4 1 c b a 5 1 b c a 6 1 b a c 是否可以将此列表的
  • R ggplot 中的柯尔莫哥洛夫-斯米尔诺夫图

    我正在尝试在 r 中绘制 KS 图 一切似乎都很顺利 除了我只能使用颜色来可视化两个不同的样本而不是线型这一事实 我已经尝试过以下方法 sample1 lt SD13009 sample2 lt SD13009PB group lt c r
  • 在 RcppArmadillo 中将列向量乘以数值标量

    我在编译这个简单的程序时遇到一些麻烦c 代码使用Rcpp和RcppArmadillo包裹 采用以下简单示例 将矩阵的每一列乘以数值标量 code lt arma mat out Rcpp as
  • R Shinydashboard 自定义 CSS 到 valueBox

    我一直在尝试将 valueBox 的颜色更改为自定义颜色 超出 validColors 中可用的颜色 但一直无法这样做 我知道有一种方法可以使用标签来包含自定义 CSS 但是我无法将它们放在正确的位置 ui lt dashboardPage
  • 在 R 中提取 data.frames 列表的名称以及 data.frame 中的值

    在下面的代码中 j是 data frames 的命名列表 我想知道是否有办法 a 提取变量的数值 即one short and one long 在 data frames 内并附加它们的相关名称 即 AAA or BBB or CCC 到
  • 在 RMarkdown 输出到 PDF 时缩进而不添加项目符号点或编号

    之前有人问过如何在没有项目符号的情况下缩进文本 RMarkdown 中的点 但这是针对 HTML 输出的 在 RMarkdown 中缩进而不添加项目符号点或数字 https stackoverflow com questions 47087
  • 如何获得 JavaScript 阶乘程序的循环来显示所使用的工作?

    你好 我面临着用 JavaScript 编写一个程序的挑战 尽管我对它不太了解 但它要求用户输入一个数字 然后计算该数字的阶乘 我使用了已经提出的问题并设法使计算正常工作 但无法获得所需的输出 我必须在以下输出中获取它 而不使用任何花哨的库

随机推荐

  • Java 中的就地快速排序

    为了刷新一些 Java 我尝试实现一个可以对整数数组进行排序的快速排序 就地 算法 以下是我到目前为止得到的代码 你可以通过以下方式调用它sort a 0 a length 1 如果两个 指针 都存在 则此代码显然会失败 进入无限循环 i
  • 如何在 R 中创建自累积向量

    我觉得这个很简单 但是我的R功夫很弱 我正在尝试以累积的方式创建其自身的向量 这段代码可以工作 但我想要更优雅和自动化的东西 我有数百万行需要累积 a lt c 4 4 5 1 9 a lt a order a k lt a 1 lengt
  • Tessnet2 Init-Method 在某些 tessdata 路径下崩溃

    我正在使用 Tessnet2 程序集 它使用 Tesseract 来进行 OCR 不幸的是 在我调用 init 方法后 程序崩溃了 没有任何异常 tessnet2 Tesseract ocr new tessnet2 Tesseract o
  • SQL 挑战/难题:如何合并嵌套范围?

    此挑战基于涉及 IP 范围的现实生活用例 我带来的解决方案基于堆栈跟踪我之前提出过的挑战 每个范围开始都被视为PUSH操作 每个范围结束 1 被视为POP手术 挑战 我们有一个范围数据集 其中每个范围都有起点 终点和值 create tab
  • XSLT - 在输出中用转义文本替换撇号

    我正在编写一个 XSLT 模板 需要为 xml 站点地图输出有效的 xml 文件
  • WPF 图像控件中的初始图像

    我的项目中有一个从互联网加载的 WPF 图像控件 延迟加载 我想在图像控件中显示初始图像 直到主图像加载 请帮助我
  • 为什么 Python 不会因切片越界而抛出错误? [复制]

    这个问题在这里已经有答案了 MATLAB 为此抛出错误 gt gt a 2 3 4 gt gt a 3 4 index out of bounds 如果用 Python 尝试类似的事情 为什么它不是非法的 gt gt gt a 2 3 4
  • 区分“没有行受到影响”和行成功更新为相同值(MySQL 和 PHP)

    我正在从 PHP 执行 SQL MySQL 命令 每次执行有几种可能的结果 记录更新为新值 记录已更新 但值恰好相同 记录找不到要更新的行 即没有行与WHERE clause 我想知道如何区分 的 1 和 3 两种情况都返回零作为受影响的行
  • 为什么在请求中使用 Cache-Control 标头?

    这一页 on Cache Control指定以下内容 可以使用的标准缓存控制指令由客户在一个 HTTP 请求 我认为只有服务器会发回有关客户端是否应该缓存响应的信息 为什么客户端要向服务器发送缓存信息 客户端和服务器之间可以有任意数量的中间
  • TCL:Windows 中线程之间的双向通信

    我需要在 Tcl 中的线程之间进行两种方式的通信 而我所能得到的只是一种将参数作为我唯一的 master gt helper 通信通道传入的方式 这是我所拥有的 proc ExecProgram command if catch open
  • 如何将数据模板分配给文本框wpf

    文本框应该显示某些访问权限的隐藏美元金额 我创建了一个转换器类 继承自 IValueConverter 来通过实现转换方法来处理屏蔽 public object Convert object value Type targetType ob
  • 如何将 Memory Sanitizer 与 GCC 一起使用?

    我想在 gcc 中使用这种消毒剂 我怎样才能做到这一点 这样的手术可以吗 我找到了 clang 的解决方案 clang fsanitize memory fno omit frame pointer g O2 umr cc但我不知道如何在
  • 如何更新 RestTemplate 以正确映射 Java 日期?

    我有一个问题 我的RestTemplate postForEntity url restRequest RepoResponse class 调用失败 因为它无法反序列化以下形式的日期 2019 02 01T12 00 00 000 050
  • 动画 matplotlib imshow

    让我首先澄清一下 我并不是想生成像中那样的随机游走线this和许多其他问题 我正在尝试制作一个随机游走热图 它会随着点的重新访问而改变颜色 例如this I ve been able to create still lifes like t
  • 如何通过事件从 UserControl 的代码隐藏中触发 JS

    在 ASP NET C 中 我想从 UserControl 的代码隐藏中显示 ALERT HI 但不起作用 用户控制
  • Ant调试和ant发布失败

    我正在尝试使用 ant 在命令行上生成 apk 我可以使用 ant clean 但对于 ant debug 和 ant release 命令我收到以下错误 构建失败 C Android sdk tools ant build xml 649
  • 是否可以下载旧版本的 XCode?

    我不经常使用 XCode 进行开发 最近 MacPorts 告诉我 我需要获得 3 1 才能使包正常工作 我去了苹果 他们给了我最新的版本 结果只适用于 OSX 6 因为我有 OSX 5 所以它对我没有任何帮助 目前有什么方法可以从苹果获得
  • 如何对输入字段进行分区以在屏幕上显示为单独的输入字段?

    看图片 我想要设计如图所示的内容 其中用户需要输入 4 位一次性密码 OTP 现在我已经通过 4 个单独的输入然后在 javascript 中组合值来实现这一点
  • 如何在 D3.js 力定向图中设置焦点节点?

    我有一个数据集 它定义了在力定向图中使用的多个节点 看起来像 var nodeSet id N1 name Node 1 type Type 1 hlink http www if4it com id N2 name Node 2 type
  • R 中的阶乘记忆化

    我编写这个函数来查找数字的阶乘 fact lt function n if n lt 0 cat Sorry factorial does not exist for negative numbers n else if n 0 cat T