Till KTH:s startsida Till KTH:s startsida

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?

Lärare Linda Kann skapade sidan 13 september 2016