Namnrum, räckvidd och rekursion Linda Mannila 29.11.2007.

Slides:



Advertisements
Liknande presentationer
En introduktion till programmeringsspråket Python
Advertisements

Anders Sjögren Lagringsklasser •en variabel i C har två attribut –type( int, float, char..... ) –lagringsklass( auto, extern, register, static ) •lagringsklassens.
Funktioner och programorganisation
2D1311 Programmeringsteknik med PBL
Prolog, Mån 16/9 Rebecca Jonson.
Sökning och sortering Linda Mannila
Programmeringsteknik
Repetition inför provet
För utveckling av verksamhet, produkter och livskvalitet. Rekursiva algoritmer, en annan sort tänkande -Hur -När -Bra/Dåligt (kap 7)
2D1311 Programmeringsteknik med PBL Föreläsning 3 Skolan för Datavetenskap och kommunikation.
För utveckling av verksamhet, produkter och livskvalitet. Algoritmer och datastructurer - Lite mer rekursivitet -Sorterrings algoritmer -- Kapitel 8 Algoritmer.
Algoritmer och datastrukturer
Metoder i java Det finns två typer av metoder i java
Föreläsning 4 Python: mera om funktioner och parametrar
2D1311 Programmeringsteknik med PBL Föreläsning 4 Skolan för Datavetenskap och kommunikation.
Grundläggande programmering
Föreläsning 2 Datalogi för E1 2D1343
Föreläsning 5 Python: argument från kommando-tolken
Föreläsning 4 Python: Definiering av egna funktioner Parametrar
i olika programmeringsspråk
Programmering B PHP Lektion 2
Föreläsning 5.  Idag  Kap 7 i Dawson  Filer  Felhantering med try…except.
Detection of similarity between documents Axel Bengtsson Ola Olsson
Pointers. int a=5; int f(int b) { a--; b++; return b; } int main() { int a=3; printf("%d,",f(a)); printf("%d",a); return 0; }
Föreläsning 4 Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö.
Programmeringsteknik
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 8 ( ) Innehåll: Trådprogrammering i Java - Avbrott (”interrupts”) - Metoden join() -
Mer om arv - Polymorfism Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael Kölling Fredric Ragnar
Föreläsning 3 Programmeringsteknik och Matlab DD1312
Lennart Edblom, Frank Drewes, Inst. f. datavetenskap 1 Föreläsning 8: Underprogram Underprogram Räckvidd Parameteröverföring.
Funktioner, styrstrukturer, manipulering av matriser
1 Föreläsning 3 programmeringsteknik och Matlab 2D1312/ 2D1305 Matlab fortsättning Funkioner, styrstrukturer, manipulering av matriser.
Grundläggande programmering
Rekursiva algoritmer Hur När Bra/Dåligt (kap 7).
DD1311 P ROGRAMMERINGSTEKNIK MED PBL Föreläsning 9 Skolan för Datavetenskap och kommunikation.
Träning 13 Makroprogrammering
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Metoder -Lokala variabler -Mera om klasser: -Nyckelorden.
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
Funktioner Linda Mannila Vad kan vi nu? Primitiva datatyper Tal, strängar, booleska värden Samlingsdatatyp Listan Utskrift Indata Felhantering.
Java paket och jar-filer
Föreläsning 8 Programmeringsteknik och Matlab DD1312 Klassmetoder Egen modul, Self Metoderna: __str__, __lt__,… Meddelande Arv, Överlagring av metoder,
Problemlösningsmetodik
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 5 ( ) INNEHÅLL: -Metoder.
F4 - Funktioner & parametrar 1 Programmeringsteknik, 4p vt-00 Modularisering ”svarta lådor” Väl definierade arbetsuppgifter Enklare validering Enklare.
IV1023 ht2013 nikos dimitrakas KTH/ICT/SCS 1 IV1023 ht2013 Avancerad Datahantering med XML XSLT nikos dimitrakas Rum 8522 Läsanvisningar.
F. Drewes, Inst. f. datavetenskap1 Föreläsning 8: Underprogram Underprogram Räckvidd Parameteröverföring.
Rekursion. En metoddefinition som innehåller ett anrop av sig själv kallas rekursiv.
Programmeringsteknik Föreläsning 8 Skolan för Datavetenskap och kommunikation.
Programmeringsteknik Föreläsning 17 Skolan för Datavetenskap och kommunikation.
2D1311 Programmeringsteknik med PBL Föreläsning 4 Skolan för Datavetenskap och kommunikation.
1 Mönstermatchning och rekursion Nr 4. 2 Förenklad notation val fnname = fn name => expression Förenklas till fun fnname name = expression Exempel fun.
1 Föreläsning 8 Mer om klasser och objektorientering.
F. Drewes, Inst. f. datavetenskap1 Föreläsning 9: Implementering av underprogram Aktiveringsposter Exekveringsstacken Implementera dynamisk räckvidd.
Anders Sjögren Deklarationsområde och funktioner.
Karl-Henrik Hagdahl, 11 november Repetition Logikprogrammering: måndag 11 november 2002.
För utveckling av verksamhet, produkter och livskvalitet. Algoritmer och datastrukturer - En annan sort tänkande, rekursiva metoder -Datastrukturen träd,
1 Matlab, föreläsning 1 Oktober MATLAB Perspektiv på materialdesign Lina Kjellqvist Rum: K324 Telefon:
Anders Sjögren Data (i primärminnet) som en länkad lista datatypen för varje element i listan är en struktur, post ( struct )
OOP&M - teori1 OOP&M – Föreläsning 5 kap 8-13 Operatorer,typkonvertering, booleska operatorer, if och else.
Anders Sjögren Enkelt program med funktion /* two_func.c - a program that uses two functions in one file */ /* from Stephen Prata C Primer Plus ISBN
Program indata ? utdata 1/20 Vahid Mosavat, Nada, KTH.
1 Föreläsning 4 Metoder & parametrar Array API och klassen ArrayList.
1 Föreläsning 13 programmeringsteknik och Matlab Funktioner, styrstrukturer, mer om matriser.
Föreläsning 3 Väsentliga delar i ett Javaprogram Input i paketet extra
Anders Sjögren Funktioner något in och något annat ut.
För utveckling av verksamhet, produkter och livskvalitet. Algoritmer och datastructurer - En annan sort tänkande, rekursiva metoder -Datastrukturen träd.
KPP053, HT2015 MATLAB, Föreläsning 4
Lektion 4.
Python.
Föreläsning 11: Rekursion
Presentationens avskrift:

Namnrum, räckvidd och rekursion Linda Mannila

Liten repetition om funktioner Vad händer om man i en funktion har en variabel med samma namn som en variabel på yttersta nivån (rotnivån)? Hur kan Python i sådana fall skilja på variablerna?

Namnrum (namespaces) Alla namn ordnas i namnrum Inte bara variabelnamn, utan även namn på funktioner etc. Varje namn får endast förekomma en gång i ett namnrum Men samma namn får finnas i godtyckligt många namnrum utan att störa varandra På rotnivån finns ett globalt namnrum som alltid finns tillgängligt Inne i en funktion finns ett lokalt namnrum som endast finns tillgängligt inne i den funktionen Funktionen dir() visar alla namn som finns definierade i det aktuella namnrummet

>>> dir() ['__builtins__', '__doc__', '__name__'] >>> min_variabel = 3 >>> dir() ['__builtins__', '__doc__', '__name__', 'min_variabel'] >>> def min_funktion(): print "Jag är min egen funktion!" >>> dir() ['__builtins__', '__doc__', '__name__', 'min_funktion', 'min_variabel'] >>> def min_funktion(): print "Jag är en annan funktion med samma namn. Då försvinner" print "den första versionen för ett namnrum kan inte innehålla" print "fler än en version av ett namn." >>> dir() ['__builtins__', '__doc__', '__name__', 'min_funktion', 'min_variabel'] >>> min_funktion() Jag är en annan funktion med samma namn. Då försvinner Den första versionen för ett namnrum kan inte innehålla fler än en version av ett namn.

Räckvidd (scope) En variabels räckvidd definieras som den programkod som har tillgång till det namnrum där variabeln finns definierad En variabels räckvidd anger var variabeln “syns” utgörs av det block som den definierats i, med start från den plats där den definierats Därför syns t.ex. en lokal variabel i en funktion inte utanför funktionen

Hur hittar Python rätt namn? Då en funktion körs Söker Python först efter namnet i det lokala namnrummet (dvs. inne i funktionen) Om variabeln inte hittas där, fortsätter Python söka i det globala namnrummet Om variabeln inte hittas där, fortsätter Python söka i det inbyggda namnrummet Om variabeln inte heller hittas där, uppstår ett fel

Vilka namn hittas var? def get_info(): text = raw_input("Input info. Any info: ") return text def get_second_info(): text = raw_input("Input some other info. Any other info: ") return text info = get_info() info2 = get_second_info() all_info = info + info2 all_info = all_info.upper() print all_info

Skillnad? def get_info(): text = raw_input("Input info. Any info: ") return text def get_second_info(): text = raw_input("Input some other info. Any other info: ") return text def main(): info = get_info() info2 = get_second_info() all_info = info + info2 all_info = all_info.upper() print all_info

Lokala vs. globala variabler Variabler som deklareras inne i en funktion är inte relaterade till andra variabler med samma namn utanför funktionen Variablerna är lokala för funktionen Variablernas räckvidd är just den funktionen, inget annat Kan lista de lokala och globala variablerna i ett program var som helst med funktionerna locals() och globals()

Exempel def function(): x = 2 print 'Changed local x to', x x = 50 print 'x is', x function() print 'x is still', x Output: x is 50 Changed local x to 2 x is still 50

Exempel def function(): x = 2 print 'Changed local x to', x print 'Local variables inside the function: ', locals() x = 50 print 'x is', x function() print 'x is still', x print 'Local variables outside of the function: ', locals() Output x is 50 Changed local x to 2 Local variables inside the function: {'x': 2} x is still 50 Local variables outside of the function: {'function': <function function at 0x02AC4E70>, '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'C:\\Python25\\Lib\\idlelib\\idle.pyw', 'idlelib': <module 'idlelib' from 'C:\Python25\lib\idlelib\ __init__.pyc'>, 'x': 50, '__name__': '__main__'}

Parametrar blir också lokala variabler def upphoj(tal, potens): print locals() return tal**potens print upphoj(5,2) print tal print potens Output: {'tal': 5, 'potens': 2} 25 Traceback (most recent call last): File "local_global4.py", line 6, in print tal NameError: name 'tal' is not defined

Namnrum och moduler Om en modul importeras med import modulnamn måste modulens namn användas som ”prefix” för att komma åt modulens funktioner Detta kan undvikas genom att använda from modulnamn import * eller from modulnamn import namn Men! Om två moduler definierar samma namn som båda importeras till programmet sker en krock Den andra importen skriver över gamla definitioner T.ex. om vi skulle göra importen from webbrowser import open skulle vi inte längre kunna komma åt den inbyggda funktionen open för att öppna filer Använd därför from -formen sparsamt

Frågor?

Rekursion Fråga: Vad är rekursion? Svar: Något som definieras rekursivt Fråga: Vad betyder rekursiv? Svar: En metod som är rekursiv är definierad genom rekursion. Fråga: Vad är rekursion? Svar: Något som definieras rekursivt osv.

Rekursion En rekursiv definition är definierad utgående från sig själv: "Rekursion:... För mer information, se Rekursion. “ En funktion är rekursiv om dess definition innehåller ett anrop till sig själv def minfunktion(): kod... return minfunktion() + 1

Varför rekursion? Ibland är ett problem för stort eller för komplext för att kunna lösas utan att bli alltför stort Lösning: bryt ner problemet i mindre delar av sig självt lös dessa delar skilt för sig kombinera alla dellösningar för att få en lösning till det ursprúngliga problemet ”Divide and conquer” Rekursion är en bra teknik som kan användas på många intressanta problem.

När används rekursion? Många kända rekursiva exempel Summaberäkning Fakultet Fibonacci Towers of Hanoi Binary search Quick sort Mergesort... Se Alla algoritmer som bygger på iteration (loopar) kan även skrivas rekursivt och vice versa

Standardexempel: Fakultet (n!) 0! = 1 1! = 1 n! = n * (n-1)! Rekursiv definition osv.

Att koda rekursivt En rekursiv funktion är uppbyggd av två element som alltid måste finnas med Ett basfall Ett rekursivt anrop Basfallet det undantag som får den rekursiva funktionen att avslutas får aldrig vara rekursivt, skall oftast returnera ett enkelt värde Det rekursiva anropet det som skall ske om inte basfallet gäller anropar den egna funktionen OBS! Som i en while-loop måste man se till att något ändras för att “minska problemet” för varje rekursivt anrop

Rekursiv fakultet i Python def factorial(n): # Basfallet if n == 0 or n == 1: return 1 # Rekursiva anropet else: return n * factorial (n-1)

Rekursiv fakultet - exekveringen factorial(5) 5 * factorial(4) 4 * factorial(3) 3 * factorial(2) 2* factorial(1) 1 * 1 Basfallet har nåtts! Kan börja ”nysta upp” exekveringen

Rekursiv fakultet - exekveringen factorial(5) 5 * factorial(4) 4 * factorial(3) 3 * factorial(2) 2* factorial(1) 1 * 1 1*1=1 2*1=2 3*2=6 4*6=24 5*24=120

Rekursiv summa def summa(n): # Basfall if n == 1: return 1 # Rekursivt anrop else: return n + summa(n-1)

Iterativ summa def summa(n): i = 1 summa = 0 while i <= n: summa += i i += 1 return summa

Rekursion vs. iteration Vad är bättre? Rekursion ger ett stort antal funktionsanrop kostsamt då det slukar mycket minne långsammare än iteration Rekursiva funktioner är kortare lättare att skriva och debugga

Rekursion - checklista En rekursiv funktion måste ha (minst) ett basfall En rekursiv funktion måste ha (minst) ett rekursivt anrop Varje rekursivt anrop måste “minska på problemet”

Fibonacci Sanskrit, ideala bisamhällen, gyllene snittet, Åbo Energis skorsten.. Definieras enligt: fib(0) = 0 fib(1) = 1 fib(n-1) + fib(n-2) för alla n > 1 fibonacci.py