换零钱和快速幂

 换零钱总的思路就是包括某个币值的和不包括的,然后递归。

 

 

 

用递归的思路不需要考虑太多的细节,对于这种加的递归,我们简单来看就是一个递归树的执行,也就是说两者不可能是同时的,所以不用考虑冲突的问题。

var i []int

func main() {
    i = []int{1, 2, 3, 5, 10}
    println(fff(2, 5))
}

func fff(a, n int) int {
    if a == 0 {
        return 1
    }
    if a < 0 || n == 0 {
        return 0
    }
    return fff(a, n - 1) + fff(a - i[n - 1], n)
}

 

 

求幂的话,作为从业者肯定不能写累乘这种,实在太无脑。

 

思路是什么呢,就是用利用二进制

 a^11 = a(2  ^ 0 + 2 ^ 1 + 2 ^ 3) = a ^(1011);

这个例子就很明显了,就是将n转换为二进制表达,然后再算的时候我们只需要对通过进制来避免重复的从0-n这种的相乘,计算机到不太在乎你乘的数值大小,反而在意你的次数。

 

func FastPow(a, n int) int {
    ans := 1
    base := a

    for n != 0 {
        if n & 1 != 0 {
            ans = ans * base
        }
        base *= base
        n >>= 1
    }
    return ans
}

func NormalPow(a, n int) int {
    ans := 1
    base := a
    for n != 0 {
        ans *= base
        n--
    }
    return ans
}

 

end

posted @ 2020-03-02 17:56  zhangyu63  阅读(130)  评论(0编辑  收藏  举报