Raku中的多子程序递归

问题描述

我正在学习{@ {3}}这本书

我需要定义ackermann函数的练习。

我定义了一个正整数子集:

subset Positive-Integer of Int where { $_ > 0}

然后我使用以下方法遍历递归版本:

multi ackermann(0,Positive-Integer $n) {
    $n + 1;
}

multi ackermann(Positive-Integer $m,0) {
    ackermann $m - 1,1;
}

multi ackermann(Positive-Integer $m,Positive-Integer $n) {
    ackermann $m - 1,ackermann $m,$n - 1;
}

但是执行我在执行时得到的代码:

ackermann 3,4;

> * * &ackermann
> > * * &ackermann
> > * * &ackermann
> > ackermann 3,4
Cannot resolve caller ackermann(Int:D,Int:D); none of these signatures match:
    (0,Int $n)
    (Int $m,0)
  in sub ackermann at <unknown file> line 3
  in sub ackermann at <unknown file> line 3
  in sub ackermann at <unknown file> line 3
  in sub ackermann at <unknown file> line 3
  in sub ackermann at <unknown file> line 3
  in sub ackermann at <unknown file> line 3
  in sub ackermann at <unknown file> line 3
  in block <unit> at <unknown file> line 2

> 

我不明白这是怎么回事。

解决方法

从错误输出来看,您似乎正在尝试在REPL中运行这些示例。查看错误输出中的实际错误,似乎缺少该候选项:

multi ackermann(Positive-Integer $m,Positive-Integer $n) {
    ackermann $m - 1,ackermann $m,$n - 1;
}

如果我将您的示例的完整代码放入文件中:

subset Positive-Integer of Int where { $_ > 0}

multi ackermann(0,Positive-Integer $n) {
    $n + 1;
}

multi ackermann(Positive-Integer $m,0) {
    ackermann $m - 1,1;
}

multi ackermann(Positive-Integer $m,$n - 1;
}

say ackermann 3,4;

我得到了预期的结果(125)。

在我看来,您在将代码输入REPL会话时出现了某种错误。

专业提示:如果您尝试使用多行代码的示例,通常将每个示例存储到单独的文件中会更容易。这样可以使您对代码有更多的监督,可以更轻松地进行更改和查看其结果,并且如果要重新查看过去所做的示例,还可以追溯到以后。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...