换零钱总的思路就是包括某个币值的和不包括的,然后递归。
用递归的思路不需要考虑太多的细节,对于这种加的递归,我们简单来看就是一个递归树的执行,也就是说两者不可能是同时的,所以不用考虑冲突的问题。
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