LeetCode50. 动态规划方法求阶乘

18 篇文章 0 订阅
6 篇文章 0 订阅

leetcode 50 pow(x, n)

三种解决思路

  1. 调用库函数
  2. 暴力迭代
  3. 分治法(本文方法)
  • 1, 2就不用说了, 第三种分治法,分治法本质上是一种动态规划方法,例如2的十次方求法可以先求 2的5次方, 再求2的2次方。 需要注意的是2的5次方和2的2次方不需要求2次,而是使用备忘录将求过的子问题进行记录,下一次求求解时直接使用。

  • count变量和前三个函数式为了打印递归层次帮助理解的

var count = 0

func printIndent(){
	fmt.Printf("%v", ">")
	for i:=0;i < count;i++{
		fmt.Printf("%v", "  >")
	}
}

func leftIndent(format string, params ...interface{}){
	printIndent()
	fmt.Printf(format+"\n", params... )
	count --
}

func rightIndent(format string, params ...interface{}){
	count++
	printIndent()
	fmt.Printf(format+"\n", params... )
}

func myPow(x float64, n int) float64{
	mem:=make(map[int]float64)
	if n<0{
		return 1/myPowFunc(x, -n, mem)
	}
	return myPowFunc(x, n, mem)
}

func myPowFunc(x float64, n int, mem map[int]float64) float64  {
	rightIndent("n = %v", n)
	if n==0{
		leftIndent("return:  %v", 1)
		return 1
	}
	if n==1{
		leftIndent("return:  %v", x)
		return x
	}
	if n==-1{
		leftIndent("return: %v", 1/x)
		return 1/x
	}
	if ret, ok:=mem[n];ok{
		leftIndent("return: %v", ret)
		return ret
	}
	if n&1==1{
		mem[n] = myPowFunc(x, n/2, mem)*myPowFunc(x, n/2, mem)*x
	}else{
		mem[n] = myPowFunc(x, n/2, mem)*myPowFunc(x, n/2, mem)
	}

	leftIndent("return: %v", mem[n])
	return mem[n]
}

以210 为例,打印结果可以清晰看到递归层次和备忘录的作用

			>  >n = 10
			>  >  >n = 5
			>  >  >  >n = 2
			>  >  >  >  >n = 1
			>  >  >  >  >return:  2
			>  >  >  >  >n = 1
			>  >  >  >  >return:  2
			>  >  >  >return: 4
			>  >  >  >n = 2
			>  >  >  >return: 4
			>  >  >return: 32
			>  >  >n = 5
			>  >  >return: 32
			>  >return: 1024

性能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值