gpt4 book ai didi

unit-testing - 我如何在 Kotlin 中测试 tailrec 函数?

转载 作者:行者123 更新时间:2023-11-28 19:55:22 24 4
gpt4 key购买 nike

我正在尝试测试以下 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 返回我 1.0 作为 Actualvalue 我可以推导出函数是仅在没有递归的情况下启动一次。

关于如何正确测试 tailrec 函数的任何建议?

希望有人能帮我解决这个问题。谢谢大家。


编辑

这篇文章的重点是测试 tailrec 函数以避免 StackOverflowError 所以,我将在这里发布两个简单的测试,但是 sa1nt 的答案是正确的对于我的问题,Benoit 的技巧非常适合简化 tailrec 测试

因此,以下用于测试 StackOverflowError 的函数是这样的:

没有避免

private fun testStackOverFlow(num : Double): Double = if (num == 10000000000.0) num else testStackOverFlow(num+1)

回避

private tailrec fun testNOTStackOverFlow(num : Double): Double = if (num == 10000000000.0) num else testNOTStackOverFlow(num+1)

测试函数:

@Test
fun testNewFeatures(){

TestCase.assertEquals(10000000000.0, testStackOverFlow(1.0))
TestCase.assertEquals(10000000000.0, testNOTStackOverFlow(1.0))
}

谢谢大家的回答。祝你有美好的一天。

最佳答案

长见识

  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()所以使用默认参数值。所以,条件 if (abs(x - cos(x)) < eps) x else ...对于 eps = 5.0x = 1.0将返回 x进入功能后立即。

关于unit-testing - 我如何在 Kotlin 中测试 tailrec 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58975380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com