首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Raku中的多子程序递归

Raku中的多子程序递归
EN

Stack Overflow用户
提问于 2020-09-14 10:24:00
回答 1查看 254关注 0票数 17

我在学习raku,跟在书“乐库”中的思考后面

我需要一个练习来定义ackermann函数。

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

代码语言:javascript
复制
subset Positive-Integer of Int where { $_ > 0}

然后,我使用以下方法浏览递归版本:

代码语言:javascript
复制
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;

代码语言:javascript
复制
> * * &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

> 

我不明白这里发生了什么事。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-14 12:57:55

从错误输出判断,您似乎试图在REPL中运行这些示例。查看错误输出中的实际错误,似乎缺少了这个候选:

代码语言:javascript
复制
multi ackermann(Positive-Integer $m, Positive-Integer $n) {
    ackermann $m - 1, ackermann $m, $n - 1;
}

如果我把你的例子的全部代码放在一个文件中:

代码语言:javascript
复制
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会话时犯了某种错误。

贴士:如果您尝试使用多行代码的示例,通常更容易将每个示例存储到一个单独的文件中。这会让您对代码进行更多的监督,更容易地进行更改并查看其结果,如果您想要重新查看您过去做过的示例,那么您可以在稍后返回一些内容。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63882440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档