【发布时间】:2018-11-21 06:34:13
【问题描述】:
我一直在玩文本 WebAssembly,想写一个递归斐波那契数计算器。
我得到了一个可以工作的版本,但它使用单个分支 if 语句来检查基本情况:
(module
(export "fib" (func $fib))
(func $fib (param $0 i32) (result i32)
(if
(i32.lt_s
(get_local $0)
(i32.const 2)
)
(return
(i32.const 1)
)
)
(return
(i32.add
(call $fib
(i32.sub
(get_local $0)
(i32.const 2)
)
)
(call $fib
(i32.sub
(get_local $0)
(i32.const 1)
)
)
)
)
)
)
我在 wabt 中对此进行了测试:https://webassembly.github.io/wabt/demo/wat2wasm/
我尝试使用 select conditional 重写它:
(module
(export "fib" (func $fib))
(func $fib (param $0 i32) (result i32)
(select
(return
(i32.const 1)
)
(return
(i32.add
(call $fib
(i32.sub
(get_local $0)
(i32.const 2)
)
)
(call $fib
(i32.sub
(get_local $0)
(i32.const 1)
)
)
)
)
(i32.lt_s
(get_local $0)
(i32.const 2))))
)
这编译为 .wasm,但它没有按预期运行,只是返回基本情况。我用 if-then-else 尝试了类似的版本,但无济于事。为什么单分支的结果与双分支条件的结果不同?
【问题讨论】:
标签: recursion webassembly