我试图将这个递归函数转换为尾递归函数
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中,但任何语言的示例都会有所帮助。
答案 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))