我如何在 Kotlin 中测试 tailrec 函数?
How can i test a tailrec function in Kotlin?
我正在尝试测试以下 tailrec 函数:
private tailrec fun findFixPoint(eps: Double = 5.0, x: Double = 1.0): Double = if (abs(x - cos(x)) < eps) x else findFixPoint(cos(x))
这是我的测试函数:
@Test
fun testNewFeatures(){
TestCase.assertEquals(0.7390851332151611, findFixPoint())
}
固定点是 0.7390851332151611
但 assertEquals
returns 我 1.0
因为 Actualvalue
我可以推导出该功能只启动一次而没有递归。
关于如何正确测试 tailrec
函数的任何建议?
希望有人能帮我解决这个问题。谢谢大家。
编辑
这个 post 的真正意义是测试 tailrec 函数以避免 WhosebugError
所以,我将 post 这里有两个简单的测试,但是 sa1nt
´对于我的问题,s 的回答是正确的,Benoit
的提示对于简化 tailrec 测试非常有用
所以,下面测试WhosebugError
的函数是这样的:
没有避免
private fun testWhosebug(num : Double): Double = if (num == 10000000000.0) num else testWhosebug(num+1)
避免了
private tailrec fun testNOTWhosebug(num : Double): Double = if (num == 10000000000.0) num else testNOTWhosebug(num+1)
测试函数:
@Test
fun testNewFeatures(){
TestCase.assertEquals(10000000000.0, testWhosebug(1.0))
TestCase.assertEquals(10000000000.0, testNOTWhosebug(1.0))
}
谢谢大家的回答。祝你有美好的一天。
对于这种方法,Black-box testing似乎是最合适的。基本上,您在不知道内部细节的情况下测试该方法。您必须只检查给定输入的结果是否正确,即 what 该方法的作用。这就是你所做的。但是不需要检查如何方法得出这个结果。
现在假设您完全重写了您的方法以使用迭代而不是递归:您不需要重写测试,它们都仍然有效。
TLDR
- 将您的函数更改为:
tailrec fun findFixPoint(eps: Double = 5.0, x: Double = 1.0): Double =
if (abs(x - cos(x)) < eps) x
else findFixPoint(eps, cos(x)) // eps argument added
- 测试为:
@Test
fun testNewFeatures(){
TestCase.assertEquals(0.7390851332151611, findFixPoint(eps = 0.05)) // overriding default eps value
}
详情
在递归调用中显式提供两个参数。否则 cos(x)
将用于 eps
因为它是第一个参数:
private tailrec fun findFixPoint(eps: Double = 5.0, x: Double = 1.0): Double = if (abs(x - cos(x)) < eps) x else findFixPoint(eps, cos(x))
在测试中,您像这样调用函数 findFixPoint()
,因此使用默认参数值。所以,eps = 5.0
和x = 1.0
的条件if (abs(x - cos(x)) < eps) x else ...
在进入函数后会立即returnx
我正在尝试测试以下 tailrec 函数:
private tailrec fun findFixPoint(eps: Double = 5.0, x: Double = 1.0): Double = if (abs(x - cos(x)) < eps) x else findFixPoint(cos(x))
这是我的测试函数:
@Test
fun testNewFeatures(){
TestCase.assertEquals(0.7390851332151611, findFixPoint())
}
固定点是 0.7390851332151611
但 assertEquals
returns 我 1.0
因为 Actualvalue
我可以推导出该功能只启动一次而没有递归。
关于如何正确测试 tailrec
函数的任何建议?
希望有人能帮我解决这个问题。谢谢大家。
编辑
这个 post 的真正意义是测试 tailrec 函数以避免 WhosebugError
所以,我将 post 这里有两个简单的测试,但是 sa1nt
´对于我的问题,s 的回答是正确的,Benoit
的提示对于简化 tailrec 测试非常有用
所以,下面测试WhosebugError
的函数是这样的:
没有避免
private fun testWhosebug(num : Double): Double = if (num == 10000000000.0) num else testWhosebug(num+1)
避免了
private tailrec fun testNOTWhosebug(num : Double): Double = if (num == 10000000000.0) num else testNOTWhosebug(num+1)
测试函数:
@Test
fun testNewFeatures(){
TestCase.assertEquals(10000000000.0, testWhosebug(1.0))
TestCase.assertEquals(10000000000.0, testNOTWhosebug(1.0))
}
谢谢大家的回答。祝你有美好的一天。
对于这种方法,Black-box testing似乎是最合适的。基本上,您在不知道内部细节的情况下测试该方法。您必须只检查给定输入的结果是否正确,即 what 该方法的作用。这就是你所做的。但是不需要检查如何方法得出这个结果。
现在假设您完全重写了您的方法以使用迭代而不是递归:您不需要重写测试,它们都仍然有效。
TLDR
- 将您的函数更改为:
tailrec fun findFixPoint(eps: Double = 5.0, x: Double = 1.0): Double =
if (abs(x - cos(x)) < eps) x
else findFixPoint(eps, cos(x)) // eps argument added
- 测试为:
@Test
fun testNewFeatures(){
TestCase.assertEquals(0.7390851332151611, findFixPoint(eps = 0.05)) // overriding default eps value
}
详情
在递归调用中显式提供两个参数。否则
cos(x)
将用于eps
因为它是第一个参数:
private tailrec fun findFixPoint(eps: Double = 5.0, x: Double = 1.0): Double = if (abs(x - cos(x)) < eps) x else findFixPoint(eps, cos(x))
在测试中,您像这样调用函数
findFixPoint()
,因此使用默认参数值。所以,eps = 5.0
和x = 1.0
的条件if (abs(x - cos(x)) < eps) x else ...
在进入函数后会立即returnx