论坛首页 编程语言技术论坛

有奖竞猜

浏览 8861 次
锁定老帖子 主题:有奖竞猜
精华帖 (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)
0 请登录后投票
   发表时间: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就好了
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics