OCaml中nat类型实现Sudan函数遇结果不符问题求助
问题分析与修复
你的sudan_nat实现完全没有遵循Sudan函数的递归逻辑,这是测试结果不符的根本原因。同时你的测试用例预期结果似乎也和Sudan函数的实际计算结果不符,下面一步步说明:
1. Sudan函数的正确递归规则
Sudan函数的标准定义(对应Peano自然数):
- 当
m为Zero时,sudan_nat Zero n p = add_nat n p - 当
m不为Zero但p为Zero时,sudan_nat (Succ m') n Zero = n - 当
m和p都不为Zero时,sudan_nat (Succ m') n (Succ p') = sudan_nat m' (sudan_nat (Succ m') n p') (Succ p')
2. 你的代码问题
你当前的helper函数本质就是add_nat的等价实现,最终sudan_nat的逻辑是把m+n+p的结果再加1,这和Sudan函数的递归增长逻辑完全无关,自然无法得到符合预期的结果。
3. 正确的sudan_nat实现
按照递归规则编写的正确代码如下:
type nat = Zero | Succ of nat let rec add_nat m n = match m with | Zero -> n | Succ m' -> Succ (add_nat m' n) let zero_nat = Zero let one_nat = Succ zero_nat let two_nat = Succ one_nat let four_nat = add_nat two_nat two_nat let rec sudan_nat m n p = match m with | Zero -> add_nat n p | Succ m_prev -> match p with | Zero -> n | Succ p_prev -> sudan_nat m_prev (sudan_nat (Succ m_prev) n p_prev) p
4. 测试结果说明
用你的测试输入sudan_nat one_nat two_nat two_nat,按照Sudan函数的规则计算结果应该是5(Succ (Succ (Succ (Succ (Succ Zero))))),而不是你预期的12。这说明你对Sudan函数的输出预期可能有误,可能混淆了Sudan函数与其他递归类函数(比如Ackermann函数)的规则或参数顺序。
内容的提问来源于stack exchange,提问作者Danish Abbas
相关产品推荐
相关产品推荐

