-1

我正在研究一个涉及斐波那契数列的 Io 问题。我正在尝试创建一种方法来测试一个数字是否是斐波那契数。我不知道为什么我的 IsAFib 方法不起作用,有谁知道为什么以及我可以做些什么来解决它?我对 Io 真的很陌生,对编程也很陌生,所以如果你能描述你改变事物的原因,我真的很感激!我想知道它需要有所不同,而不仅仅是应该写成什么。

            OperatorTable addOperator("xor", 11)
            true xor := method(bool, if(bool, false, true))
            false xor := method(bool, if(bool, true, false)) 

            doFile("isASquare.io");

然后 isASquare.io 文件:

            isASquare := method(n,                    
                    for(i, 1, n, 
                        if(i * i == n, return true)
                        if(i * i > n, return false)
                    )
            )

            isAFib := method(n,
                    if(isASquare(2 ** 5 * n) xor isASquare(2 ** n * 5 - 4), return true, return false)
            )
4

1 回答 1

2

所以这是一个时不时出现的问题。动态运算符的工作方式是,当 vm 加载源文件时,在我们评估任何一个源文件之前,我们应用围绕运算符的规则。在第一次运行时,io 只知道它的内置操作符。一旦这个消息重新排序完成,那么我们将开始评估文件中的代码,即首先是这一行:

OperatorTable addOperator("xor", 11)

当这段代码运行时,它对这个文件有任何影响已经太晚了。

社区中的普遍共识是将所有操作符放在您首先加载的文件中,然后在该文件的末尾,让它doFile()或类似地加载您将使用它们的主文件。

这有点让人头疼,但在 Io 中没有传统的编译时间。

于 2013-03-29T15:26:20.130 回答