Raku 中的多子程序递归
Multi subroutine recursive in Raku
我正在学习乐曲,正在学习这本书Thinking in Raku
有一个练习需要我定义 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;
}
但是执行时得到的代码是:
阿克曼 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, Positive-Integer $n) {
ackermann $m - 1, ackermann $m, $n - 1;
}
say ackermann 3, 4;
我得到了预期的结果 (125
)。
所以在我看来,您在将代码输入 REPL 会话时犯了某种错误。
专业提示:如果您正在尝试使用多行代码的示例,通常将每个示例存储到一个单独的文件中会更容易。这使您可以更好地监督代码,更轻松地进行更改并查看其结果,如果您想重新访问过去完成的示例,您可以稍后返回。
我正在学习乐曲,正在学习这本书Thinking in Raku
有一个练习需要我定义 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;
}
但是执行时得到的代码是:
阿克曼 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, Positive-Integer $n) {
ackermann $m - 1, ackermann $m, $n - 1;
}
say ackermann 3, 4;
我得到了预期的结果 (125
)。
所以在我看来,您在将代码输入 REPL 会话时犯了某种错误。
专业提示:如果您正在尝试使用多行代码的示例,通常将每个示例存储到一个单独的文件中会更容易。这使您可以更好地监督代码,更轻松地进行更改并查看其结果,如果您想重新访问过去完成的示例,您可以稍后返回。