Hjälp med Python uppgift, rekursivt. Nybörjare

Permalänk
Medlem

Hjälp med Python uppgift, rekursivt. Nybörjare

Skriv en funktion is_alphanumeric(s) som avgör ifall strängen s endast består av siffror,
bokstäver och mellanslag (space).
Två krav är att funktionen skall arbeta rekursivt samt att det finns en bra docstring som
dokumentation.
Exempel:
>>> is_alphanumeric('movie')
True
>>> is_alphanumeric('3D movie')
True
>>> is_alphanumeric('3D-movie')
False
Tips 1: Använd strängarnas inbyggda metoder isdigit() och isalpha().
Tips 2: Man kan plocka ut första tecknet ur en sträng s med s[0]. Man kan plocka ut en valfri
bit av en sträng med hjälp av ”slice-operatorn”, prova t.ex. vad som händer med 'abcdef'[3:5]
och 'abcdef'[:2] och 'abcdef'[2:].

Här är min uppgift som jag önskar lösa, har precis börjat en programmeringskurs och har endast gått den 2v.
Skulle vara glad om jag kunde få en lösning samt bra förklaring på hur det ska fungera.
Efter att ha suttit 7h och inte fattat något så vänder jag mig till er
Hoppas ni inte tycker att det är fusk, jag önskar även förstå uppgiften och inte bara söker kod.

Permalänk

Jag tänker inte ge dig svaret, men om du utvecklar hur du har tänkt hittills så kanske vi här kan leda dig på rätt spår eller säga om det är nått du tänker fel.

Förstår du de två tipsen som du fått? Kan du göra det som tipsen föreslår i Python-interpretatorn?

Permalänk
Medlem

Hur mycket utav denna del av dokumentations guiden har du läst? http://docs.python.org/tutorial/controlflow.html#defining-functions

Visa signatur
Permalänk
Datavetare

Rekursion består alltid av 3 delar

  1. villkor när du är "färdig"

  2. utföra operationen på första elementet du har just nu

  3. anropa dig själv med det första elementet borttaget

I ditt fall är du färdig när du anropar funktionen med en tom sträng. Så skriv den delen först. Tänk också igenom vad du bör retunera om du kommit till slutet på strängen.

Att ta hand om ett element i ditt fall blir att avgöra om första tecknet är en bokstav, siffra eller mellanslag. Är första tecknet inte något av dessa tre, vet du då inte vad funktionen ska retunera som helhet?

Annars, ta bort första bokstaven och retunera resultatet av anrop dig själv med den kvarvarande strängen.

Detta är funktionen skriven på svenska, nu får du skriva den i Python

Edit: Hehe, jag läste definitivt inte problembeskrivning ordentligt. Har fixat min "implementation" nu

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av VirtualIntent:

Jag tänker inte ge dig svaret, men om du utvecklar hur du har tänkt hittills så kanske vi här kan leda dig på rätt spår eller säga om det är nått du tänker fel.

Förstår du de två tipsen som du fått? Kan du göra det som tipsen föreslår i Python-interpretatorn?

Det jag har gjort hittills är:

def is_alphanumeric(s):
'''Här kommer vi kolla om (s) inehåller bokstäver,nummer och mellanslag.'''
if str.isdigit(s):
print "True"
elif str.isalpha(s):
print "True"
elif str.isspace(s):
print "True"

else:
print "False"

Som det ser ut nu så kan jag inte blanda bokstäver, nummer och space, utan bara få true om s=endast b,n eller space.
Jag tror jag förstår tips 1, python känner av vad det är själv med "is"
tips 2 vill jag gärna ha lite hjälp med hur jag ska applicera och förstå den bättre.
Om jag fattat den rätt så kan man titta på strängen man just skrivit in i delar. Skriver jag "minne2" så läser den det bokstav för bokstav?
Kan jag då kolla i ett ord både efter nummer,bokstäver och space?
Som sagt är jag ny, och har lite svårt att snappa upp allt, har inte heller jobbat rekursivt, vilket jag tror betyder att funktionen anropar
sig själv med andra värden på något vis. tex att den först granskar texten efter bara siffror och efter det letar bokstäver.
"bubbelq" har inte läst något av den så tar mig en titt nu tack på förhand

Permalänk
Medlem

[QUOTE=Yoshman;12682794]Rekursion består alltid av 3 delar

  1. villkor när du är "färdig"

  2. utföra operationen på första elementet du har just nu

  3. anropa dig själv med det första elementet borttaget

I ditt fall är du färdig när du anropar funktionen med en tom sträng. Så skriv den delen först. Tänk också igenom vad du bör retunera om du kommit till slutet på strängen.

Att ta hand om ett element i ditt fall blir att avgöra om första tecknet är en bokstav eller siffra. Bry dig inte om resten. Är det en siffra, vet du då inte vad funktionen ska retunera som helhet?

Annars, ta bort första bokstaven och retunera resultatet av anrop dig själv med den kvarvarande strängen.

Detta är funktionen skriven på svenska, nu får du skriva den i Python :)[/QUOTE]

Den här var trevlig att läsa Om jag förstod dig rätt nu är mitt mål att få en tom sträng i funktionen dvs
jag börjar med is_alpanumeric("hej 123") och vill att ("hej 123") ska granskas från början till slut.
Kolla om första bokstaven är antingen alpha.digit eller space, är den det så går man vidare till nästa
bokstav "e" och gör samma koll på den... osv tills man kollat alla och på så vis har en godkänd string ?
Om man skulle ha skrivit ("hej! 123") skulle funktionen märka av " ! " tecknet och gå ner på funktionens else: print false.

Jag hoppas jag förstått det rätt
Dock vet jag inte riktigt hur man skriver det i kod men jag ska läsa på lite till, tack för hjälp!

Permalänk
Medlem

Tror jag fattat slice operatorn nu
def is_alphanumeric(s):
x = (s)
print x[0:3]

om jag anger def is_alphanumeric("hej")
skriver den nu ut från 1 till 3, och om jag skriver hej! så skriver den fortfarande bara hej.

Permalänk
Medlem

Nu vet jag hur jag vill göra men har kört fast!

def is_alphanumeric(s):
x = (s)
if x[0:1] == str.isdigit:
print "True"

elif x[0:1] == str.isalpha:
print "True"

elif x[0:1] == str.isspace:
print "True"

#if is_alphanumeric(): <--- Här är målet
#print "True"
else:
print "False"

Just nu vill jag att det jag skriver in i (s) blir x, sedan kolla om x[0:1] är något av en siffra,bokstav eller space för att gå vidare.
Dock får jag alltid svaret False som print när jag testar min kod och undrar om det inte är möjligt att köra sådär?

Permalänk

Något som jag saknar i koden du postat är rekursion.

Vad har du lärt dig om rekursion hittills? Vet du att en rekursiv funktion är en funktion som anropar sig själv? Någonstans i din funktion is_alphanumeric() så ska du alltså anropa is_alphanumeric() igen, fast med ett annat argument (som virtual void skriver i sina 3 punkter).

Låter följande vettigt?: om du vill testa att hela strängen uppfyller ett villkor så kan du testa att den första bokstaven uppfyller villkoret samt att den sträng du får genom att ta bort den första bokstaven också uppfyller villkoret.

Sen tror jag att din funktion ska göra "return True" och inte "print 'True'". När du anropar funktionen så kommer interpretatorn att skriva ut värdet som returneras.

Permalänk
Medlem

Något som är grundläggande i programmering är att bryta ned ett stort problem i mindre delproblem tills delproblemen är så små att deras lösning är trivial.

För att se om en sträng består av uteslutande alfanumeriska tecken skulle nog få programmerare välja en rekursiv algoritm, men det är oväsentligt då din uppgift kräver det.

En mer rättfram iterativ approach skulle ställa frågorna "Är det första tecknet alfanumeriskt?", "Om ja, är det andra tecknet alfanumeriskt?", "Om ja, är det tredje tecknet alfanumeriskt?" o.s.v. till strängen är slut (eller svaret blir "nej").

Rekursivt skulle frågan snarare ställas "Är det första tecknet alfanumeriskt?", "Om ja, är resten av strängen alfanumerisk?" och sedan upprepa dessa frågor till strängen tar slut (eller svaret blir "nej").

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem
Skrivet av VirtualIntent:

Något som jag saknar i koden du postat är rekursion.

Vad har du lärt dig om rekursion hittills? Vet du att en rekursiv funktion är en funktion som anropar sig själv? Någonstans i din funktion is_alphanumeric() så ska du alltså anropa is_alphanumeric() igen, fast med ett annat argument (som virtual void skriver i sina 3 punkter).

Låter följande vettigt?: om du vill testa att hela strängen uppfyller ett villkor så kan du testa att den första bokstaven uppfyller villkoret samt att den sträng du får genom att ta bort den första bokstaven också uppfyller villkoret.

Sen tror jag att din funktion ska göra "return True" och inte "print 'True'". När du anropar funktionen så kommer interpretatorn att skriva ut värdet som returneras.

Inte helt hemma på hur man skriver rekursion, men jag vet att man kallar på funktionen igen med ett annat värde.
Och det du säger är vettigt, jag vill testa första bokstaven eller siffran om den går igenom min if, och efter det hämta bokstav 2 i meningen
samt radera den 1a bokstaven som är klar och har gått igenom.

def is_alphanumeric(s):
x = (s)
if x[0:1] == str.isdigit or str.isalpha or str.isspace:
if x[1:2] == str.isdigit or str.isalpha or str.isspace:
Osv
return is_alphanumeric()
else:
return is_alphanumeric()

Det jag undrar nu är hur man skriver detta rätt, och om man på något sätt kan få x[0:1] att gå igenom hela ordet utan att behöva gå upp till [10:11] eller vad nu ordet blir, man vet ju inte det för ens man skriver ordet.
Har för mig att det fanns ett sätt att ta hela ordet med [0::] så man måste väl kanske få in att 0an blir +1 för att gå framåt medans
[:] vet själv när det slutar :/

Skriver man bara return på slutet eller ska man avsluta med return is_alphanumeric() ? som då är kollat och förhoppningsvis True?

Permalänk
Medlem
Skrivet av EpicEra:

*test*

Har för mig att det fanns ett sätt att ta hela ordet med [0::] så man måste väl kanske få in att 0an blir +1 för att gå framåt medans
[:] vet själv när det slutar :/

*text*

Vet inte om en for loop är likadan i python som i java, men sätt det i en loop med en variabel istället för 0, sedan så plussar du på 1 på variabeln hela tiden.
Sedan kan du ju kolla längden så att om det är "hej" så ska du väl slicea [0:2]? Och då så plussar du på båda varje gång loopen "loopar" tills den har hittat ordet, tex

while 1: [x:y] x=x+1 y=y+1

Hoppas att du förstår vad jag menar med koden Har knappt skrivit någon python själv så

Permalänk
Medlem
Skrivet av Kabeltv:

Vet inte om en for loop är likadan i python som i java, men sätt det i en loop med en variabel istället för 0, sedan så plussar du på 1 på variabeln hela tiden.
Sedan kan du ju kolla längden så att om det är "hej" så ska du väl slicea [0:2]? Och då så plussar du på båda varje gång loopen "loopar" tills den har hittat ordet, tex

while 1: [x:y] x=x+1 y=y+1

Hoppas att du förstår vad jag menar med koden Har knappt skrivit någon python själv så

Har aldrig kodat jave, har aldrig kodat förut så jag fattar inte så mycket haha

def is_alphanumeric(s):
if s[0].isdigit() or s[0].isalpha() or s[0].isspace():

if s.isdigit() or s.isalpha() or s.isspace():

return "True"
else:
return "False"

Så ser min kod ut nu, och jag tror jag förstår vad du säger
I min if s[0] så borde [0] vara en variabel dvs [y], sedan göra så att y= y+1 varje gång första bokstaven uppfyller kravet?
Lyckas inte klura ut något med din kod tyvärr, inte heller vet jag hur jag ska skriva för att [0] ska bli en variabel.
y = [0]
y = y+1 verkade inte fungera.

Permalänk
Medlem

skulle jag kunna jobba in " len " på något sätt för att bestämma hur långt det jag skriver in är?
eller kan jag lösa det utan len?

Permalänk
Medlem
Skrivet av EpicEra:

skulle jag kunna jobba in " len " på något sätt för att bestämma hur långt det jag skriver in är?
eller kan jag lösa det utan len?

Du behöver inte len för en rekursiv lösning (men du kan använda det när du kollar om strängen är tom).

Normalt kunde man löst uppgiften med

def is_alphanumeric(s) if len(s) > 0: for x in range(0, len(s)-1): if not (s[x].isalpha() or s[x].isdigit() or s[x].isspace()): return False return True

men den lösningen är inte rekursiv.

Rekursivt innebär att du använder samma funktion (d.v.s. ställer samma fråga/frågor) på en mindre del av problemet. Tänk dig att du skall kolla strängen "Alfa", då kan du minska problemet genom att kolla strängarna "A" och "lfa". Strängen "A" är trivial, och för att kolla "lfa" kan du minska problemet genom att kolla "l" och "fa" etc. Hoppas jag inte gett dig för mycket hjälp nu, men jag antar att det viktigaste är att du lär dig konceptet rekursion.

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem
Skrivet av EpicEra:

Har aldrig kodat jave, har aldrig kodat förut så jag fattar inte så mycket haha

def is_alphanumeric(s):
if s[0].isdigit() or s[0].isalpha() or s[0].isspace():

if s.isdigit() or s.isalpha() or s.isspace():

return "True"
else:
return "False"

Så ser min kod ut nu, och jag tror jag förstår vad du säger
I min if s[0] så borde [0] vara en variabel dvs [y], sedan göra så att y= y+1 varje gång första bokstaven uppfyller kravet?
Lyckas inte klura ut något med din kod tyvärr, inte heller vet jag hur jag ska skriva för att [0] ska bli en variabel.
y = [0]
y = y+1 verkade inte fungera.

Nja, du ska jämföra den sliceade stringen med det talet som du skulle ha fram, är det falskt så lägger du till 1 på varje variabel och testar igen, om ordet finns så kommer du komma fram till det till slut. Koden som jag skrev är ingen riktig kod Och detdära med rekursiv vet jag inte vad det är, har kanske missuppfattat hela uppgiften

Permalänk

Många har skrivit bra svar, men här kommer ytterligare ett försök till en förklaring.

Testa programmera följande algoritm:

Strängen "sune1234" är alfanumerisk om:
1. Första tecknet, "s" är en bokstav eller siffra, samt
2. Resten av strängen, "une1234", är alfanumerisk.

Hur ska du få svar på punkt 2? Jo du har just gjort en funktion som löser det, så anropa den. Det är detta som är rekursion.

Och ja, du har nytta av len.

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av VirtualIntent:

Och ja, du har nytta av len.

Om du tänker på basvillkoret så kan kontrollen om listan är tom göras med "if not s" istället för att kontrollera att strängens längd är noll (python definierar en tom sträng som False och en icke-tom som True...om jag inte missminner mig).

@TS: Att använda len faller sig ganska naturligt, om än inte nödvändigt, i ditt fall (så ignorera vad jag skrev till VirtualIntent). Du har dock ingen större nytta av att veta längden på det du skrev in i det allmänna fallet, du behöver bara veta om/när längden är noll.

Behöver du ytterligare hjälp så säg bara till. Rekursion (anrop till sig själv / definition i termer av sig själv) kan vara klurigt i början.

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem
Skrivet av PeCe:

@TS: Att använda len faller sig ganska naturligt, om än inte nödvändigt, i ditt fall (så ignorera vad jag skrev till VirtualIntent). Du har dock ingen större nytta av att veta längden på det du skrev in i det allmänna fallet, du behöver bara veta om/när längden är noll.

Vad ska funktionen returnera när den får in ""?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Vad ska funktionen returnera när den får in ""?

När funktionen får in en tom sträng ("") bör den returnera True. Om man till en alfanumerisk sträng lägger till en tom sträng så måste den resulterande strängen också vara alfanumerisk då den är identisk med den initiala strängen (Exempel: "Alfa" + "" = "Alfa"). Detta uppnås endast om en tom sträng definieras som alfanumerisk.

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem
Skrivet av PeCe:

När funktionen får in en tom sträng ("") bör den returnera True. Om man till en alfanumerisk sträng lägger till en tom sträng så måste den resulterande strängen också vara alfanumerisk då den är identisk med den initiala strängen (Exempel: "Alfa" + "" = "Alfa"). Detta uppnås endast om en tom sträng definieras som alfanumerisk.

Intressant tanke, jag förstår hur du tänker men tycker fortfarande det är mer logiskt att slänga exception. En alfanumerisk sträng är enligt den givna definitionen "en sträng som bara innehåller bokstäver, siffror och mellanslag". En tom sträng innehåller inget av det.

edit: det backas även upp av att "".isalpha() och "".digit() returnerar false

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Intressant tanke, jag förstår hur du tänker men tycker fortfarande det är mer logiskt att slänga exception. En alfanumerisk sträng är enligt den givna definitionen "en sträng som bara innehåller bokstäver, siffror och mellanslag". En tom sträng innehåller inget av det.

edit: det backas även upp av att "".isalpha() och "".digit() returnerar false

Att slänga en exception slår mig som det minst logiska då en tom sträng är en sträng. Att "".isalpa() och "".isdigit() returnerar False istället för att kasta exceptions visar helt klart att "" är en sträng. is_alphanumeric() bör således returnera True eller False när den matas med en tom sträng.

Om isdigit() definieras som sant för "en sträng som innehåller siffror" blir "".isdigit() False.
Om isdigit() definieras som sant för "en sträng som inte innehåller icke-siffror" blir "".isdigit() True.

Om du kollar documentationen för isdigit() står att läsa: "It return true if all characters in the string are digits and there is at least one character, false otherwise.". De har alltså valt den översta definitionen

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem
Skrivet av PeCe:

Att slänga en exception slår mig som det minst logiska då en tom sträng är en sträng. Att "".isalpa() och "".isdigit() returnerar False istället för att kasta exceptions visar helt klart att "" är en sträng. is_alphanumeric() bör således returnera True eller False när den matas med en tom sträng.

Om isdigit() definieras som sant för "en sträng som innehåller siffror" blir "".isdigit() False.
Om isdigit() definieras som sant för "en sträng som inte innehåller icke-siffror" blir "".isdigit() True.

Om du kollar documentationen för isdigit() står att läsa: "It return true if all characters in the string are digits and there is at least one character, false otherwise.". De har alltså valt den översta definitionen

Efter att ha funderat lite får jag lov att hålla med dig angående exception. Min ursprungliga tanke var att en tom sträng vare sig är eller "inte-är" en alfanumerisk sträng, om man definierar att en sådan endast får innehålla tecken som antingen är siffror, bokstäver eller mellanslag — "inget innehåll" är vare sig en siffra, bokstav eller ett mellanslag.

Däremot tycker jag fortfarande det är felaktigt att låta funktionen returnera true för tom sträng och vidhåller att man bör använda antingen len eller något liknande.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Hedersmedlem

*Fullständiga svar borttagna*

Det finns ingen explicit regel mot att ge fullt svar så jag kan inte hänvisa till någon fin paragraf, och anser inte att någon gjorde "fel", men i läxtrådar o dyl så är ett fullt svar inte optimalt. Låt trådskaparen vara drivande med frågor om sin egen implementation, så som det redan har fungerat ett längre tag i tråden.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem
Skrivet av Teknocide:

Efter att ha funderat lite får jag lov att hålla med dig angående exception. Min ursprungliga tanke var att en tom sträng vare sig är eller "inte-är" en alfanumerisk sträng, om man definierar att en sådan endast får innehålla tecken som antingen är siffror, bokstäver eller mellanslag — "inget innehåll" är vare sig en siffra, bokstav eller ett mellanslag.

Däremot tycker jag fortfarande det är felaktigt att låta funktionen returnera true för tom sträng och vidhåller att man bör använda antingen len eller något liknande.

Det är ju en definitionsfråga, men med tanke på 1. hur de som skrivit funktionen i python definierat isalpha, isdigit, isspace och 2. hur frågan är formulerad i uppgiften så får jag nog hålla med dig. Rekursionens stoppvillkor/basvillkor bör sättas vid längden 1, och längden 0 bör returnera falskt.

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem
Skrivet av PeCe:

Det är ju en definitionsfråga, men med tanke på 1. hur de som skrivit funktionen i python definierat isalpha, isdigit, isspace och 2. hur frågan är formulerad i uppgiften så får jag nog hålla med dig. Rekursionens stoppvillkor/basvillkor bör sättas vid längden 1, och längden 0 bör returnera falskt.

Tack vare hur just isalpha et al. är definierade kan man även sätta stoppvillkoret till mindre än 2 för att undvika en extra if

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Hej igen glada sweclockare!
Oj vad tråden dragit iväg!
Har kommit lite längre med min kod, tack för alla goda tips, jag är nog väldigt nära nu.

def is_alphanumeric(s ,x=0):

if x < len(s):

if s[x].isdigit() or s[x].isalpha or s[x].isspace:
is_alphanumeric(s ,x+1)
return True
else:
return False
else:
return False

Inte helt säker på vad som blir fel i den dock :/
skriver jag "hej123!" får jag svaret True även fast "!" inte är num,alpa eller space..
Tog lite hjälp igår av läraren på kursen, jag kom så här långt själv + lite hjäp av er samt läraren med tänket.
Han pillade på min kod i slutet så den blev helt funktionell men jag fattade inte hur det gick till
Han lyckades inte förklara så bra heller så det slutade med att jag satt med den helt färdiga koden utan att förstå.

Den färdiga koden har jag i skolan så jag kan inte se tillbaka på den just nu, det jag minns var att han la till
ans = is_alphanumeric(s ,x+1) på något sätt
och return ans för att få svaret False när man satte in "!"

Så nu är min uppgift klar i skolan men eftersom jag inte lyckades förstå den till 100% så anser jag inte
att jag är klar alls, även om det var en frivillig uppgift så önskar jag förstå vad mer som ska göras
hoppas ni står ut lite till

Permalänk
Datavetare

Om du har en funktion som heter foo och ser ut så här

def foo(): return False

och kör detta

if foo: print "foo is true" else: print "foo is false" if foo(): print "foo() is true" else: print "foo() is false"

så blir utskriften från programmet

foo is true foo() is false

Varför då? Jo, "foo" är en referens till den plats som funktionen är lagrad och den har ett värde som Python tolkar som "inte lika med False". "foo()" ger däremot ett anrop till funktionen med namnet "foo", som i sin tur alltid ger resultatet "False".

Det var ditt ena misstag, du glömde "()" så det blev inget anrop.

Det andra är att du måste använda nyckelordet "return <something>" för att din funktion ska avsluta med resultatet av "<something>". Du gjorde ett korrekt rekursivt anrop, men du använda aldrig resultatet från detta anrop, ska vara "return is_alphanumeric(s ,x+1)". Antar att din lärare fixade dessa två saker för sedan var det nästan korrekt (ett return False ska ändras till return True också).

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

@TS:

Det finns tre fall du behöver ta hänsyn till:
1. Strängen är 0 tecken lång (du returnerar false).
2. Strängen är ett tecken lång (du returnerar True eller False baserat på om tecknet är alfanumeriskt eller ej).
3. Strängen är flera tecken lång (du returnerar True eller False baserat på om 1. första tecknet är alfanumeriskt och 2. resten av strängen är alfanumerisk).

När du använder din x-variabel så säger du till funktionen "Kolla strängen med början på tecken nr x". Ett smidigare sätt att göra detta är att helt enkelt bara mata funktionen med delsträngen som börjar på tecken nr x. Exempel:
is_alphanumeric("Alfa", 0)
is_alphanumeric("Alfa", 1)
is_alphanumeric("Alfa", 2)
is_alphanumeric("Alfa", 3)
skulle lika gärna kunna hanteras som
is_alphanumeric("Alfa")
is_alphanumeric("lfa")
is_alphanumeric("fa")
is_alphanumeric("a")
om du vid varje anrop, istället för att öka din x-variabel (som inte behövs), plockar bort det första tecknet från strängen. För att ta bort första tecknet använder du t.ex. s[1:]

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Hedersmedlem
Skrivet av EpicEra:

def is_alphanumeric(s ,x=0):

if x < len(s):

if s[x].isdigit() or s[x].isalpha or s[x].isspace:
is_alphanumeric(s ,x+1)
return True
else:
return False
else:
return False

Skriv [code] innan och [/code] efter koden så blir den formaterad så här i forumet:

def is_alphanumeric(s, x=0): if x < len(s): if s[x].isdigit() or s[x].isalpha or s[x].isspace: is_alphanumeric(s, x+1) return True else: return False else: return False

vilket gör det mycket lättare att läsa; speciellt i fallet med Python där det snabbt faktiskt blir omöjligt att se hur din kod fungerar om man inte får med indragen.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.