趣味百题之逻辑推理

# -*- coding: utf-8 -*- """ Created on Sun Jan 15 20:46:14 2017 @author: alis """ # 1.斐波那契数列,求前面25项 def fibona(n): a = [1] * n for i in range(2,n): a[i] = a[i-1] + a[i-2] return a z_25 = fibona(25) # 2.汉诺塔问题 def move(a, b, c, n): if n == 1: print a, "->", c return move(a, c, b, n - 1) print a, "->" ,c move(b, a, c, n - 1) n = input() move('A','B','C', n) pause = 2**n - 1 #3. '''王二、张三、李四、刘五年龄成一等差数列,他们四人的年龄相加是28,相乘是585。 求以他们的年龄为前4项的等差数列的前15项。''' def fun_age(): matrix = [] for i in range(1,7): d = (14-2*i)/3 temp = i*(i+d)*(i+2*d)*(i+3*d) if temp == 585: for j in xrange(15): matrix.append(j*d+i) return matrix fun_age() #4. 张三说李四在说谎,李四说王五在说谎,王五说张三和李四都在说谎。 # 现在问:这三人中到底谁说的是真话,谁说的是假话? t = [True, False] for a in t: for b in t: for c in t: a0 = not b b0 = not c c0 = not a and not b if a == a0 and b == b0 and c == c0: print a, b, c # 5. '''张、王、李三家各有三个孩子。一天,三家的九个孩子在一起比赛短跑,规定不分年龄大小, 跑第一得9分,跑第二得8分,依此类推。比赛结果各家的总分相同,且这些孩子没有同时到达终点, 也没有一家的两个或三个孩子获得相连的名次。已知获得第一名的是李家的孩子,获得第二名的是 王家的孩子。 问获得最后一名的是谁家的孩子?''' # 平均分为15分 Li = [] Wang = [] for i in xrange(1,3): Li.append(i) Li.append(6-i) for j in range(1,3): if j != i and j !=(6-i) and (7-j)!=(6-i): Wang.append(j) Wang.append(7-j) # 结果是王家 #每家的总分 (1+2+3...+9) / 3 = 15, 李家有孩子第一, 王家有孩子第二。穷举。 for li in [[x, 6 - x, 9] for x in xrange(1, 6) if 6 - x - x > 1]: tw = range(1, 10) map(tw.remove, li) for wang in [[x, 7 - x, 8] for x in tw if 7 - x in tw and 7 - x - x > 1]: zhang = tw[:] map(zhang.remove, wang) if zhang[1] - zhang[0] > 1 and zhang[2] - zhang[1] > 1: print 'li:%s wang:%s zhang:%s' % (li, wang, zhang)

你可能感兴趣的:(趣味算法)