Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 科特林·格托普特怪癖_Kotlin - Fatal编程技术网

Kotlin 科特林·格托普特怪癖

Kotlin 科特林·格托普特怪癖,kotlin,Kotlin,以下函数(f1)按预期计算斐波那契数: fun f1(n: Int, map: MutableMap<Int, Int> = mutableMapOf(Pair(0, 0), Pair(1, 1))): Int = map.getOrPut(n) { val a = map.getOrPut(n - 1) { f1(n - 1, map) } val b = map.getOrPut(n - 2) { f1(n - 2,

以下函数(
f1
)按预期计算斐波那契数:

fun f1(n: Int, map: MutableMap<Int, Int> = mutableMapOf(Pair(0, 0), Pair(1, 1))): Int =
        map.getOrPut(n) {
            val a = map.getOrPut(n - 1) { f1(n - 1, map) }
            val b = map.getOrPut(n - 2) { f1(n - 2, map) }
            a + b
        }
看起来
f2
只接受第一个“分支”:
map.getOrPut(n-1){f2(n-1,map)}
而不是第二个。 我知道
f2
可以这样固定:

fun f2(n: Int, map: MutableMap<Int, Int> = mutableMapOf(Pair(0, 0), Pair(1, 1))): Int =
        map.getOrPut(n) {
            (
                    map.getOrPut(n - 1) { f2(n - 1, map) }
                    +
                    map.getOrPut(n - 2) { f2(n - 2, map) }
            )
        }

不酷

这是因为Kotlin在
+
后面插入了分号,并将
+
映射到,而不是您直观地期望的普通双参数加运算符

您可以通过执行Go-To声明(命令+单击mac)来确认这一点,其结构与您的问题相同。我用一元加号加上你的格式,用普通加号加上括号或不加换行


这个非预期分号的结果是,它将在Fibonnacci生成过程中递归,但从不进行任何加法,总是默默地只返回
getOrPut(n-2)
步骤的结果(因为它是函数中的最后一条语句)

这是因为Kotlin在
+
后面插入了分号,并将
+
映射到,而不是您直观地期望的普通双参数加运算符

您可以通过执行Go-To声明(命令+单击mac)来确认这一点,其结构与您的问题相同。我用一元加号加上你的格式,用普通加号加上括号或不加换行


这个非预期分号的结果是,它将在Fibonnacci生成过程中递归,但从不进行任何加法,总是默默地只返回
getOrPut(n-2)
步骤的结果(因为它是函数中的最后一条语句)

我不是Kotlin,但这听起来像是在
map.getOrPut(n-1){f2(n-1,map)}
之后的分号推理。这在Javascript中是个坏主意,在Kotlin中听起来也没有什么好主意。经过进一步的研究(和发现),我很确定这是分号插入。我还发现Kotlin分号插入似乎几乎完全没有文档记录。说真的,见鬼,JetBrains。你链接到的博客中的例子看起来很相似。移动我的+1行可以解决这个问题。@user2357112为什么不回复并收集分数?我不是Kotlin人,但这听起来像是
map.getOrPut(n-1){f2(n-1,map)}
之后的分号推理。这在Javascript中是个坏主意,在Kotlin中听起来也没有什么好主意。经过进一步的研究(和发现),我很确定这是分号插入。我还发现Kotlin分号插入似乎几乎完全没有文档记录。说真的,见鬼,JetBrains。你链接到的博客中的例子看起来很相似。移动我的+一行可以解决这个问题。@user2357112为什么不回复并收集积分呢?哎呀,我很高兴在IDE中修改了这个,但没有看到聊天。看起来我们得出了相同的结论。哎呀,我很高兴在IDE中修补了这个,但没有看到聊天。看来我们得出了相同的结论。
fun f2(n: Int, map: MutableMap<Int, Int> = mutableMapOf(Pair(0, 0), Pair(1, 1))): Int =
        map.getOrPut(n) {
            (
                    map.getOrPut(n - 1) { f2(n - 1, map) }
                    +
                    map.getOrPut(n - 2) { f2(n - 2, map) }
            )
        }
fun f2(n: Int, map: MutableMap<Int, Int> = mutableMapOf(Pair(0, 0), Pair(1, 1))): Int =
        map.getOrPut(n) {
                    map.getOrPut(n - 1) { f2(n - 1, map) } +
                    map.getOrPut(n - 2) { f2(n - 2, map) }
        }