【问题标题】:how to write mutually recursive functions in Haxe如何在 Haxe 中编写相互递归的函数
【发布时间】:2014-08-12 07:50:44
【问题描述】:

我正在尝试在 Haxe 3 中编写一个简单的相互递归函数,但无法编译代码,因为首先出现的任何一个相互函数都会报告该组中的其他函数未定义。下面是一个最小示例,其中使用相互定义的函数oddeven 来确定奇偶校验。

static public function test(n:Int):Bool  {
    var a:Int;
    if (n >= 0) a = n; else a = -n;

    function even(x:Int):Bool {
        if (x == 0)
            return true;
        else
            return odd(x - 1);
    }
    function odd(x:Int):Bool {
        if (x == 0)
            return false;
        else
            return even(x - 1);
    }
    return even(a);
}

尝试将其编译为 neko 给出:

../test.hx:715: characters 11-14 : Unknown identifier : odd
Uncaught exception - load.c(181) : Module not found : main.n

我试图在even 之前给出odd 的前向声明,就像在c/c++ 中所做的那样,但它在haxe3 中似乎是非法的。如何定义像上面这样的相互递归函数?有可能吗?

注意:我想让 oddeven 都成为包装在全局可见函数 test 中的本地函数。

谢谢,

【问题讨论】:

    标签: recursion haxe mutual-recursion


    【解决方案1】:

    您可以使用myFn = function() {} 语法,而不是对局部变量使用function myFn() {} 语法。然后,您可以在使用它们之前声明函数类型签名。

    您的代码现在应该如下所示:

    static public function test(n:Int):Bool  {
        var a:Int;
        if (n >= 0) a = n; else a = -n;
    
        var even:Int->Bool = null;
        var odd = null; // Leave out the type signiature, still works.
        even = function (x:Int):Bool {
            if (x == 0)
                return true;
            else
                return odd(x - 1);
        }
        odd = function (x:Int):Bool {
            if (x == 0)
                return false;
            else
                return even(x - 1);
        }
        return even(a);
    }
    

    这是可行的,因为 Haxe 只需要知道 evenodd 存在,并在使用它们之前设置为某个值(即使它为 null)。我们知道我们会在它们被实际调用之前将它们都设置为可调用函数。

    试试 haxe:http://try.haxe.org/#E79D4

    【讨论】:

    • 谢谢,杰森。这很接近。但是我仍然收到一个错误,抱怨 odd 没有被初始化。 ../test.hx:725: characters 19-22 : Local variable odd used without being initializedUncaught exception - load.c(181) : Module not found : main.n
    • 抱歉,我应该测试一下那个代码。那应该是var even=nullvar odd=null。 Haxe 为自己的利益而过于彻底。我将编辑我的答案。
    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    相关资源
    最近更新 更多