我如何在 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.7390851332151611assertEquals 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

  1. 将您的函数更改为:
    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
  1. 测试为:
@Test
fun testNewFeatures(){
    TestCase.assertEquals(0.7390851332151611, findFixPoint(eps = 0.05)) // overriding default eps value
}

详情

  1. 在递归调用中显式提供两个参数。否则 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))

  2. 在测试中,您像这样调用函数 findFixPoint(),因此使用默认参数值。所以,eps = 5.0x = 1.0的条件if (abs(x - cos(x)) < eps) x else ...在进入函数后会立即returnx