Sjuor
Som gjort för breddenförst med heltalskö.
from queue import Queue
q = Queue()
def makesons(tal):
if tal==100: '
print("Hundra!")
q.put(tal+7)
q.put(tal-7)
q.put(tal*7)
if(tal%7==0):
q.put(tal/7)
q.put(0)
while not q.isempty():
makesons(q.get())
|
Hoppsan, det här programmet håller på länge. Vi inför en boolesk variabel funnen som blir True när vi hittat en lösning, och låter den ingå i slingans villkor.
from queue import Queue
def makesons(tal):
if tal==100:
print("Hundra!")
return True
q.put(tal+7)
q.put(tal-7)
q.put(tal*7)
if(tal%7==0):
q.put(tal/7)
return False
q = Queue()
q.put(0)
funnen = False
while not q.isEmpty() and not funnen:
funnen = makesons(q.get())
|
Ett annat sätt att avbryta programmet är att definiera en egen klass Klar som ärver från Exception.
from queue import Queue
class Klar(Exception):
pass
def makesons(tal):
if tal==100:
print("Hundra!")
raise Klar
q.put(tal+7)
q.put(tal-7)
q.put(tal*7)
if(tal%7==0):
q.put(tal/7)
q = Queue()
q.put(0)
try:
while not q.isEmpty():
makesons(q.get())
except Klar:
print("Lösning funnen.")
|
Om man ska skriva ut lösningen:
from queue import Queue
from sys import exit
class Node:
def __init__(self, tal = 0, op = "", far = None):
self.tal = tal
self.op = op
self.far = far
def insert(tal, op, far):
nod=Node(tal, op, far)
q.put(nod)
def makesons(far):
tal = far.tal
if tal == 100:
writechain(far)
exit()
insert(tal+7, "+", far)
insert(tal-7, "-", far)
insert(tal*7, "*", far)
if(tal%7==0):
insert(tal/7, "/", far)
def writechain(p):
if p != None:
writechain(p.far)
if p.far != None:
print(p.op, "7 =", p.tal)
else:
print(p.tal)
q=Queue()
q.put(Node())
while not q.isEmpty():
makesons(q.get())
|
Utskrift:
0 + 7 = 7 + 7 = 14 * 7 = 98 * 7 = 686 + 7 = 693 + 7 = 700 / 7 = 100 |
Fråga: Kan man snabba upp programmet ytterligare genom att slopa dumbarn? Hur många gånger kommer 0 att läggas in i kön?