分数和的尾递归函数
Tail Recursive function for the sum of fractions
我正在尝试将此递归函数转换为尾递归函数
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)
}
我认为这个解决方案会起作用,但当它运行时它只是 returns 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 编写的,但任何语言的示例都会有所帮助。
您需要基本情况 (n <= 1
) 来 return 累加器,而不是 1.0
。您还会 运行 遇到问题,因为累加器是 Int
而不是 Double
,这意味着 + (1 / n)
只是添加 0
(结果1: Int
除以任何大于一的 n: Int
。
您可以通过更改 acc
的类型并将倒数的分子设为文字双精度数来解决此问题:
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)
}
这应该有效。
更正您的代码
1) Return acc (累加器) 当 n <= 1
2) 你的acc应该是Double类型
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))
我正在尝试将此递归函数转换为尾递归函数
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)
}
我认为这个解决方案会起作用,但当它运行时它只是 returns 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 编写的,但任何语言的示例都会有所帮助。
您需要基本情况 (n <= 1
) 来 return 累加器,而不是 1.0
。您还会 运行 遇到问题,因为累加器是 Int
而不是 Double
,这意味着 + (1 / n)
只是添加 0
(结果1: Int
除以任何大于一的 n: Int
。
您可以通过更改 acc
的类型并将倒数的分子设为文字双精度数来解决此问题:
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)
}
这应该有效。
更正您的代码
1) Return acc (累加器) 当 n <= 1
2) 你的acc应该是Double类型
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))