发布网友 发布时间:2022-04-24 08:39
共2个回答
懂视网 时间:2022-05-10 11:29
这篇文章主要介绍了Python使用回溯法子集树模板解决爬楼梯问题,简单说明了爬楼梯问题并结合实例形式给出了Python回溯法子集树模板解决爬楼梯问题的相关操作技巧,需要的朋友可以参考下
本文实例讲述了Python使用回溯法子集树模板解决爬楼梯问题。分享给大家供大家参考,具体如下:
问题
某楼梯有n层台阶,每步只能走1级台阶,或2级台阶。从下向上爬楼梯,有多少种爬法?
分析
这个问题之前用分治法解决过。但是,这里我要用回溯法子集树模板解决它。
祭出元素-状态空间分析大法:每一步是一个元素,可走的步数[1,2]就是其状态空间。不难看出,元素不固定,状态空间固定。
直接上代码。
代码
'''爬楼梯''' n = 7 # 楼梯阶数 x = [] # 一个解(长度不固定,1-2数组,表示该步走的台阶数) X = [] # 一组解 # 冲突检测 def conflict(k): global n, x, X # 部分解步的步数之和超过总台阶数 if sum(x[:k+1]) > n: return True return False # 无冲突 # 回溯法(递归版本) def climb_stairs(k): # 走第k步 global n, x, X if sum(x) == n: # 已走的所有步数之和等于楼梯总台阶数 print(x) #X.append(x[:]) # 保存(一个解) else: for i in [1, 2]: # 第k步这个元素的状态空间为[1,2] x.append(i) if not conflict(k): # 剪枝 climb_stairs(k+1) x.pop() # 回溯 # 测试 climb_stairs(0) # 走第0步
效果图
热心网友 时间:2022-05-10 08:37
在学习python代码时,看到有的类的方法中第一参数是cls,有的是self,经过了解得知,python并没有对类中方法的第一个参数名字做*,可以是self,也可以是cls,不过根据人们的惯用用法,self一般是在实例方法中使用,而cls则一般在类方法中使用,在静态方法中则不需要使用一个默认参数。在下面的代码中,InstanceMethod类的方法中,第一个参数是默认的self,在这里可以把self换成任何名字来表示,不会有任何影响。在类调用的时候,需要满足参数的个数要求(参数中含有*args是例外),例如13行中,类调用没有参数的时候,会提示错误。同样,实例方法的参数个数也应该满足要求,例如16行中也会报错。实例方法的一个主要特点就是需要绑定到一个对象上,python解析器会自动把实例自身传递给方法,如14行所示,而直接使用InstanceMethod.f1()调用方法是不行的。
123456710111213
class InstanceMethod(object): def __init__(self, a): self.a = a def f1(self): print 'This is {0}.'.format(self) def f2(self, a): print 'Value:{0}'.format(a)if __name__ == '__main__': # im = InstanceMethod() im = InstanceMethod('233') im.f1() # im.f2() im.f2(233)
静态方法和类方法都需要使用修饰器,分别使用的是staticmethod和classmethod。静态方法是和类没有关系的,我觉得就是包装在类中的一般方法,如下例子中,调用静态方法使用实例和不使用实例都是可以的。类方法中,默认的第一个参数使用的是cls,类方法也可以不需要实例而直接使用类调用。对于这三种不同的方法,使用方法如下例所示。那么问题来了,既然有了实例方法,类方法和静态方法与之相比又有什么好处呢?
在类方法中,不管是使用实例还是类调用方法,都会把类作为第一个参数传递进来,这个参数就是类本身。如果继承了这个使用类方法的类,该类的所有子类都会拥有了这个方法,并且这个方法会自动指向子类本身,这个特性在工厂函数中是非常有用的。静态方法是和类与实例都没有关系的,完全可以使用一般方法代替,但是使用静态方法可以更好的组织代码,防止代码变大后变得比较混乱。类方法是可以替代静态方法的。静态方法不能在继承中修改。
1234567101112131415161718
class test(object): def instance_method(self): print 'This is {0}'.format(self) @staticmethod def static_method(): print 'This is static method.' @classmethod def class_method(cls): print 'This is {0}'.format(cls)if __name__ == '__main__': a = test() a.instance_method() a.static_method() a.class_method() print '----------------------------------------' # test.instance_method() test.static_method() test.class_method()