小编Ale*_*ian的帖子

如何在R中编写递归撰写函数?

我想在R中创建一个函数"compose",它将构成作为参数给出的任意数量的函数.

到目前为止,我已经通过定义一个函数"of"来完成这个,该函数组成两个参数,然后减少这个:

of <- function(f,g) function(x) f(g(x))
id <- function(x) x

compose <- function(...) {
  argms = c(...)
  Reduce(of,argms,id)
}
Run Code Online (Sandbox Code Playgroud)

这似乎工作得很好,但是因为我正在学习R,我以为我会尝试用一种明确的递归方式来编写它,即放弃使用Reduce,这就像你在Scheme中做的那样:

(define (compose . args)
  (if (null? args) identity
      ((car args) (apply compose (cdr args)))))
Run Code Online (Sandbox Code Playgroud)

我遇到了许多障碍,目前主要的障碍似乎是论证的第一个要素没有被认为是一种功能.到目前为止我的弱尝试:

comp <- function(...) {
  argms <- list(...)
  len <- length(argms)
  if(len==0) { return(id) }
  else {
    (argms[1])(do.call(comp,argms[2:len])) 
  }
}
Run Code Online (Sandbox Code Playgroud)

吐出: Error in comp(sin, cos, tan) : attempt to apply non-function

必须有某种方法可以做到这一点,这使我望而却步.有什么建议?

functional-programming r function-composition

12
推荐指数
1
解决办法
345
查看次数

延续传递风格似乎在Clojure中没有任何区别

我一直在尝试继续传递样式,因为我可能需要尽快处理一些非尾递归函数.无论如何,要知道好的技术!我在Lua和Clojure中编写了一个测试函数; 在我的小型Android掌上电脑上运行Lua.

Lua版本似乎运行良好,Lua的堆栈已经有大约300000的深度,但是使用CPS,我很容易在系统爆炸之前完成超过7000000次迭代,可能是因为缺乏内存,而不是任何限制CPS/Lua组合.

Clojure的尝试表现不太好.只有1000多次迭代,它就是抱怨堆栈爆炸,只需使用普通迭代就可以做得更好,它的堆栈大约为1600,iirc.

任何想法可能是什么问题?JVM固有的东西,或者只是一些愚蠢的noob错误?(哦,BTW,测试功能,sigma(日志)被选中,因为它增长缓慢,Lua不支持Android上的bignums)

所有的想法,提示,建议都非常受欢迎.

Clojure代码:

user=> (defn cps2 [op]
  #_=>   (fn [a b k] (k (op a b))))
#'user/cps2

user=> (defn cps-sigma [n k]
  #_=>  ((cps2 =) n 1 (fn [b]
  #_=>           (if b                    ; growing continuation
  #_=>               (k 0)                ; in the recursive call
  #_=>               ((cps2 -) n 1 (fn [nm1]
  #_=>                        (cps-sigma nm1 (fn [f]
  #_=>                                          ((cps2 +) (Math/log n) f k)))))))))
#'user/cps-sigma

user=> (cps-sigma 1000 identity)
5912.128178488171

user=> (cps-sigma 1500 identity)

StackOverflowError   clojure.lang.Numbers.equal (Numbers.java:216)
user=> …
Run Code Online (Sandbox Code Playgroud)

recursion continuations clojure continuation-passing

1
推荐指数
1
解决办法
285
查看次数