r - R中的自引用嵌套函数?
问题描述
所以,我正在尝试编写一个递归构建大型复杂公式的函数。基本上,我想简单地工作如下:
f <- function(x) {
g <- function(y) y
for( i in 1:4 ) {
h <- g
g <- function(y) h(y)^2
}
g(x)
}
请不要嘲笑这种疯狂的动机。现在我想要得到的是一个返回 ((((x^2)^2)^2)^2) 的函数,但实际发生的是我的运行时立即崩溃,可能是因为有某种调用到一个未引用的函数或其他东西,因为我g
每次都覆盖表达式(显然我真的不知道 r 在这种情况下是如何工作的)。
我如何才能实现保留旧g
参考资料的想法?
解决方案
1)递归我们可以像这样使用递归:
h1 <- function(f, n) if (n == 1) f else function(x) f(h1(f, n-1)(x))
# test using g from questioun
h1(g, 4)(3)
## [1] 43046721
(((3^2)^2)^2)^2
## [1] 43046721
2)Reduce这用于迭代地与自身Reduce
组合一个函数。f
n
h2 <- function(f, n) function(y) Reduce(function(x, f) f(x), rep(list(f), n), y)
h2(g, 4)(3)
## [1] 43046721
3) 对于
h3 <- function(f, n) {
function(x) {
for(i in 1:n) x <- f(x)
x
}
}
h3(g, 4)(3)
## [1] 43046721
4)固定如果有一个小的固定数字,我们可以明确地写出来:
h4 <- function(x) g(g(g(g(x))))
h4(3)
## [1] 43046721
5) ComposeCompose
我们可以使用功能包 稍微简化上述任何内容。(purrr 包也有一个compose
功能。如果您已经在使用 purrr,请使用它;否则,功能的占用空间更小。)
library(functional)
h1a <- function(f, n) if (n == 1) f else Compose(f, h(f, n-1))
h2a <- function(f, n) Reduce(Compose, rep(list(f), n))
h2b <- function(f, n) do.call(Compose, rep(list(f), n))
h3a <- function(f, n) {
for(i in 1:n) ff <- if (i == 1) f else Compose(ff, f)
ff
}
h4a <- Compose(g, g, g, g)
推荐阅读
- python - 警告:张量流:模型是用形状(20、37、42)构造的输入张量(“input_5:0”,形状=(20、37、42),dtype=float32),但是
- java - 找不到:projA:。要求:项目:app
- jenkins - 在 Jenkins 中运行 Robotframework 测试时出错
- mysql - mysql CURSOR - 无法遍历记录
- javascript - 如何使用 jquery 选择 id 的第 n 个孩子
- api - 通过 Rest API 以 csv 格式导出 PowerBI 报告
- vb.net - 如何正确排序水晶报表组
- java - snmp 版本 3 客户端 android studio
- .htaccess - 带有 c-panel 的子域重定向,Wordpress 问题
- sql - N用户不应为数据输入人员同时获取相同的数据[postgres]