scala中的递归和currying

递归

以 f(a) a=1,2,3…n求和为例。
1. 线性递归

def sumFactorials(f:Int=>Int,a:Int,b:Int):Int={
    if (a >b) 0
    else f(a) + sumFactorials(f,a+1,b)
  }

2.尾递归

  def sumFacorials(f:Int=>Int,a:Int,b:Int):Int={
    def loop(a:Int,acc:Int):Int={
      if (a > b) acc
      else loop(a+1,acc+f(a))
    }
    loop(a,0)
  }

尾递归每次分配的内存不会因为递归而扩大。是因为尾递归是没递归一次算一次上一步的结果算完就释放了。而线性递归式不断迭代到终点,再回溯回去。

尾递归地讲解

currying

我的理解是函数式编程的思想

 // currying
  def smFactorials4(f:Int=>Int)(a:Int,b:Int):Int={
    def loop(a:Int,acc:Int):Int={
      if (a > b) acc
      else loop(a+1,f(a)+acc)
    }
    loop(a,0)
  }

mapReduce

  def mapReduce(f:Int=>Int,combine:(Int,Int)=>Int,zero:Int)(a:Int,b:Int):Int={
    if (a > b) zero
    else combine(f(a),mapReduce(f,combine,zero)(a+1,b))
  }
  def product(f:Int=>Int)(a:Int,b:Int):Int=mapReduce(f,(x,y)=>x*y,1)(a,b)
2a*2b
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值