Tail递归函数用于分数之和

时间:2016-12-29 15:59:52

标签: scala recursion functional-programming tail-recursion

我试图将这个递归函数转换为尾递归函数

def sumOfFractions(n: Int): Double = {
  require(n > 0, "Parameter n has to be greater than 0");
  if (n==1)
    1.0
  else
    1.0 / n + sumOfFractions(n - 1)
}

我认为这个解决方案可行但是当它运行时它只返回1.0

def sumOfFractions(n:Int):Double = {

  def inner(acc:Int, n:Int): Double={
    if(n <= 1)1.0
    else
    {
        inner(acc+(1/n),n-1)
    }

  }

  inner(0,n)
}

我认为这是因为累加器没有正确更新但我不明白为什么。代码在Scala中,但任何语言的示例都会有所帮助。

2 个答案:

答案 0 :(得分:6)

您需要基本案例(n <= 1)才能返回累加器,而不是1.0。您还会遇到问题,因为累加器是Int而不是Double,这意味着+ (1 / n)只是添加0(划分结果{任何1: Int大于1的{1}}。

您可以通过更改n: Int的类型并使倒数的分子成为文字双倍来解决此问题:

acc

这应该有用。

答案 1 :(得分:0)

更正您的代码

1)当n <= 1

时返回acc(累加器)

2)你的acc应该是Double type

3)分区应该是浮点分区

def sumOfFractions(n: Int): Double = {

  def inner(acc: Double, n:Int): Double = if(n <= 1) acc  
     else inner(acc + (1.0 / n), n - 1)

  inner(0,n)
}

使用foldLeft

  def sumOfFractions(n: Int): Double = 
    (1 to n).foldLeft(0.0)((r, c) => r + (1.0 / c))