快速检查Collatz猜想



我需要编写一个QuickCheck属性来检查大于0的给定数字的Collatz猜想。

我面临的挑战是,我的Collatz猜想代码是递归的,所以我要么像预期的那样达到1,要么永远循环。

在这种情况下,我不确定我是否知道如何使用QuickCheck。

知道吗?

我想这是为了练习编写QuickCheck属性的作业?

我怀疑这样做的目的是,如果Collatz递归以1结束(就像对所有正整数所做的那样(,并且永远循环,那么编写一个成功的测试。换句话说,你不应该检测到递归永远在循环(无论如何,你只能通过近似的方式来做到这一点,如果递归"太长",就放弃(。

因此,如果您有一个返回1的递归函数collatz :: Int -> Int,那么QuickCheck属性最终将归结为collatz n == 1。根据您对QuickCheck属性的了解,您可能只需要使用适当的类型签名来编写:prop_collatz n = collatz n == 1。或者,也许应该使用Property类型和forAll,也许应该只使用Positive类型来测试正整数。很难知道你的教练在期待什么。

我建议看看类中的一些例子,在这些例子中,您测试了正整数集、非负整数集或其他约束整数集的属性,并遵循该例子。

最新更新