锁定老帖子 主题:有奖竞猜
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-10-02
cookoo 写道 Bingo!
既然连f*g(x) = f(g(x))都想到了,应该不会想不到f^n(x) = f(...f(f(x))...)。这个题目好像太数学化了点,罪过。。。主要是我在思考简化一些数组和矩阵运算时的衍生物。 加了点排错的代码: class Proc def ^ n raise "Illegal value of power" unless n >= 1 and n.integer? Proc.new do |*args| raise "Unmatched arguments" unless self.arity == self.call(*args).size (1..n).inject(args){|result, null| result = self.call(*result)} end end end 其实这里面还有个隐蔽的bug嘿嘿。。。 你走了太多的弯路。lambda自带参数校验的。这种场合下inject也不如用n.times直接。 class Proc def ^ n raise "Illegal value of power" unless n >= 1 and n.integer? lambda { |*args| n.times {args = call(*args)}; self} end end >>>>还能继续赋值: prime = lambda{|a,*b| print a,' '; b.delete_if{|x|x%a == 0}} op = prime^10 op.call *(2..100) |
|
返回顶楼 | |
发表时间:2006-10-02
Suninny 写道 你走了太多的弯路。lambda自带参数校验的。这种场合下inject也不如用n.times直接。 class Proc def ^ n raise "Illegal value of power" unless n >= 1 and n.integer? lambda { |*args| n.times {args = call(*args)}; self} end end n.times用得果然很巧妙啊,看来我得减少喜欢用inject的不良习惯啦。你说的对,Unmatched arguments那个检验是多余的,而且还有副作用。 另外你lambda最后传self这么做有bug: f = lambda{|x| 2*x} f.call(f.call(2)) #=> 8 (f^2).call 2 #=> #<Proc: ....> 不符合f^n(x)的数学定义,self改成args就好了 |
|
返回顶楼 | |