这里应用了分而治之(divide and conquer)的思想:
递归函数bool CanYield(c1,c2,t)
if(t= =1 && ( c1= =c2 || c1→c2只需一步)) return true;if(t>1)
{ for(每个格局cm)
{ bool r1=CanYield(c1,cm,ceil(t/2));
bool r2=CanYield(cm,c2,ceil(t/2));
if(r1 && r2) return true;
}
}
return false;
分析分析
递归深度log2t,t是步数,所以就是所有分支上的最大可能时间t=2O(f(n)), log2t=O(f(n))
每递归一层,需要补充O(f(n))的空间
因此最大空间: O(f(n)) ×log2t=O(f2(n))。
注意这里的几个问题,首先是 for(每个格局cm)这里每次用的是一个cm时这里注意当返回时空间可以复用 。
其次 这里关于f(n)的问题,可以通过试探进行解决
本文探讨了一种基于分而治之策略的递归算法,该算法通过将问题分解为子问题来解决复杂任务。文章详细介绍了递归函数CanYield的实现方式,并分析了其时间和空间复杂度。
5251

被折叠的 条评论
为什么被折叠?



