【发布时间】:2017-04-11 15:30:01
【问题描述】:
我一直在研究 CodeWars katas,发现有人想出了一个非常酷的解决方案。我的问题是我不明白它是如何工作的。我了解其中的一些,例如它通常在做什么,但不了解细节。是不是自己回来了?它是如何进行计算的?有人可以向我解释一下,因为我真的要学习如何做到这一点。如果您知道我可以阅读或观看的任何其他资源,那将很有帮助。我在 Swift 文档中没有看到类似的内容。
func findDigit(_ num: Int, _ nth: Int) -> Int {
let positive = abs(num)
guard nth > 0 else { return -1 }
guard positive > 0 else { return 0 }
guard nth > 1 else { return positive % 10 }
return findDigit(positive / 10, nth - 1) }
对于上下文:
说明:
函数 findDigit 将两个数字作为输入,num 和 nth。它输出num的第n位(从右到左计数)。
注意
如果 num 为负数,忽略其符号并将其视为正值。 如果 nth 不是正数,则返回 -1。 请记住 42 = 00042。这意味着 findDigit(42, 5) 将返回 0。
例子
findDigit(5673, 4) 返回 5
findDigit(129, 2) 返回 2
findDigit(-2825, 3) 返回 8
findDigit(-456, 4) 返回 0
findDigit(0, 20) 返回 0
findDigit(65, 0) 返回 -1
findDigit(24, -8) 返回 -1
非常感谢任何帮助。谢谢。
【问题讨论】:
-
个位是数字 mod 10。如果要求提供个位,请给出。否则考虑数字 div 10 并给出它的第 n-1 个数字(与原始数字的第 n 个数字相同)。它是递归(定义:见递归)。
-
这也是一个很好的例子,你可以(在我看来)使用
guard混淆代码。 -
马丁说得很好。