我正在审查Scala的考试,并试图找出我错过的这个测验问题.我理解尾递归是"最后一次调用本身",但我对其中一些代码片段之间的区别感到困惑.为什么这被认为是尾递归,
def f(x: Int): Int = {
if (x % 2 == 0) {1}
else {f(x + 1)}
Run Code Online (Sandbox Code Playgroud)
但是,这不是吗?
def f(x: Int): Int = {
if (x % 2 == 0) {1}
else {1 + f(x + 1)}
Run Code Online (Sandbox Code Playgroud)
为函数添加1究竟是什么限制了它是尾递归?如果这是一个愚蠢的问题,我很抱歉,我没有看到数字的影响,并希望巩固我的理解.完全能够识别尾递归的任何其他指针也会很棒!
我正在编写一个Scala函数,它返回列表中偶数元素的总和,减去列表中奇数元素的总和.我不能为我的解决方案使用mutable,递归或for/while循环.下面的代码通过2/3测试,但我似乎无法弄清楚为什么它无法正确计算最后一个测试.
def sumOfEvenMinusOdd(l: List[Int]) : Int = {
if (l.length == 0) return 0
val evens = l.filter(_%2==0)
val odds = l.filter(_%2==1)
val evenSum = evens.foldLeft(0)(_+_)
val oddSum = odds.foldLeft(0)(_+_)
evenSum-oddSum
}
//BEGIN TESTS
val i1 = sumOfEvenMinusOdd(List(1,3,5,4,5,2,1,0)) //answer: -9
val i2 = sumOfEvenMinusOdd(List(2,4,5,6,7,8,10)) //answer: 18
val i3 = sumOfEvenMinusOdd(List(109, 19, 12, 1, -5, -120, -15, 30,-33,-13, 12, 19, 3, 18, 1, -1)) //answer -133
Run Code Online (Sandbox Code Playgroud)
我的代码正在输出:
defined function sumOfEvenMinusOdd
i1: Int = -9
i2: Int = 18
i3: Int = …Run Code Online (Sandbox Code Playgroud)