Rekursiv problemlösning

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
meconer
EF Sponsor
Inlägg: 497
Blev medlem: 27 april 2010, 20:07:46
Ort: Järfälla

Rekursiv problemlösning

Inlägg av meconer »

Min son hade en tenta igår med en fråga som gick ut på att bestämma antalet sätt det går att fördela poäng på ett tänkt prov.

Följande villkor gäller:

Det är 5 frågor.
Varje fråga kan ha antingen 1,2,3 eller 4 poäng för fullständigt korrekt svar.
Maxpoängen skall totalt bli 14 poäng.

Vi diskuterade saken efteråt eftersom han var sugen på att veta om han hade gjort rätt. Själv löste han det med kombinatorik på något vis som jag för länge sedan har glömt bort.

Jag gjorde ett rekursivt program i python eftersom jag tycker det är fasligt kul att göra sånt. Så tyckte jag att det blev lite elegant så jag tänkte att jag postar det här.

Kod: Markera allt

maxQuestionPoints = 4


def count_ways(available_points, questions_left):

    if questions_left == 0:
        #  Last question. Count it if available points are exactly 0
        return 1 if available_points == 0 else 0

    count = 0

    #  Use 1-4 points on this question and count how many ways the
    #  rest of the questions can use exactly available points
    for used_points in range(1,maxQuestionPoints+1):
        count += count_ways(available_points - used_points, questions_left-1)

    return count


print(count_ways(14, 5))


Programmet returnerar 135 vilket tydligen är rätt svar
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Rekursiv problemlösning

Inlägg av lillahuset »

Rekursiva program brukar bli ganska "vackra" men är i min erfarenhet mest en akademisk gren. Kul att fler gillar dem.
superx
Inlägg: 1127
Blev medlem: 19 juni 2012, 23:28:16
Ort: Linköping

Re: Rekursiv problemlösning

Inlägg av superx »

Coolt!
Hur många sätt blir det om poängen kan gå upp till 10, man får ha 20 frågor och maxpoängen ska bli 100? Tog det längre tid att köra?
sodjan
EF Sponsor
Inlägg: 43245
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Rekursiv problemlösning

Inlägg av sodjan »

Körtiden skenar exponentiellt. Med upp till 8 poäng,
8 frågor och maxpoängen 40 blir det 848.443 kombinationer.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Rekursiv problemlösning

Inlägg av lillahuset »

Men det är oackert som vi brukar säga i Östergötland.
meconer
EF Sponsor
Inlägg: 497
Blev medlem: 27 april 2010, 20:07:46
Ort: Järfälla

Re: Rekursiv problemlösning

Inlägg av meconer »

Jag körde igång ett test med 20 frågor, 20 poäng att fördela och maxpoäng per fråga är 10. Det ser ju vem som helst att det bara finns ett sätt att fördela 20 poäng på 20 frågor men programmet har rullat i några minuter nu och är ännu inte klart.

Man kan/bör såklart lägga in några orimlighetskontroller här och var men då är det inte riktigt lika tjusigt
Skriv svar