算法学习之旅

剑指Offer算法题-求和

2018-09-01  本文已影响2人  lkkwxy

题目:

求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及三目运算符

通常求1+2+…+n除了用公式n(n+1)/2之外,无外乎循环和递归两种思路。由于已经明确限制for和while的使用,循环已经不能再用了。同样,递归函数也需要用if语句或者条件判断语句来判断是继续递归下去还是终止递归,但现在题目已经不允许使用这两种语句了。

思路1

利用函数指针实现递归。
由于不能用if语句来终止递归,但是我们可以定义两个函数。一个函数充当递归函数的角色,另一个函数处理终止递归的情况。然后在根据情况在两个函数二选一,可以这么做,把递归过程中传进来的n转成bool类型,非0的话就是true,然后再把bool类型转成Int类型,也就是1,同时若n为0,先把n转成bool类型在转回来还是0,也就是相当于说可以把非0的n转成1,0还是0.这样我们可以把两个函数放到一个数组里,根据n转换之后的值去数组里取函数就行了.

代码实现
func sumTeminator(number:UInt) -> UInt {
    return 0
}
func sum(number:UInt) -> UInt {
    let funcs = [sumTeminator,sum]
    let isTeminator = Bool(truncating: NSNumber(value: number - 1))
    let funcIndex = Int(truncating: NSNumber(value: isTeminator))
    let sumFunc = funcs[funcIndex]
    return number + sumFunc(number - 1)
}
print(sum(number: 100))

思路2

利用KVC里的sum进行求和
首先初始化一个0到n的数组,然后利用KVC里的sum进行求和,初始化数组用到了Swift的Stride这个函数。

代码实现
func sum1(number:UInt) -> UInt {
    let array = Array(stride(from: 0, to: number + 1, by: 1))
    let sum = (array as NSArray).value(forKeyPath: "@sum.integerValue") as! UInt
    return sum
}
print(sum1(number: 100))
上一篇下一篇

猜你喜欢

热点阅读