• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

rekurencja i tablice w Python

VPS Starter Arubacloud
+1 głos
531 wizyt
pytanie zadane 18 stycznia 2021 w Python przez szylvvia Początkujący (300 p.)
Cześć, potrzebuję pomocy w zadaniu z rekurencją . Mam napisać funkcje rekurencyjną która zlicza ilość powtórzeń podanej liczby w liście.
komentarz 18 stycznia 2021 przez SzkolnyAdmin Szeryf (86,280 p.)
przeniesione 18 stycznia 2021 przez ScriptyChris
Pokaż kod, który SAM napisałeś. Skorygujemy.
komentarz 18 stycznia 2021 przez szylvvia Początkujący (300 p.)

*SAMA *NAPISAŁAŚ

def szukaj(tab,i,l,a,x):
     if i<x:
         if tab[i]==a:
             return szukaj(tab,i+1,l+1,a,x)
         else:
             return szukaj(tab,i+1,l,a,x)
     else:
         return l

 tab1 = [4,4,5,4,7]
 dlugosc= len(tab1)
 indeks = 0
 licznik = 0
 szukana = 4

Lista i ta szukana może być na sztywno ustawiona, jednak jak obejść te inne parametry?

komentarz 19 stycznia 2021 przez mokrowski Mędrzec (155,460 p.)

Najprościej dodasz parametr, definiując argument przekazywany do funkcji z wartością domyślną. Czyli np. tak:

def szukaj(tab, wartosc, licznik = 0):
    pass

 

 

1 odpowiedź

+1 głos
odpowiedź 18 stycznia 2021 przez Nelson89 Dyskutant (7,720 p.)

Cześć,

Jedyne potrzebne parametry to lista i liczba, której występowanie ma zostać zliczone w liście.

Możesz zrobić to tak, że funkcja rozbija tablice na mniejsze, do czasu, aż trafi na tablice o jednym elemencie i, wtedy sprawdza czy dana liczba jest poszukiwaną liczbą.

Poniżej znajdziesz przykładowy kod, który to robi.

def func(tab, liczba):
    liczba_elementow = len(tab)
    if liczba_elementow == 1:
         return tab.count(liczba)
    else:
         lewa_strona = func(tab[ : liczba_elementow // 2], liczba)
         prawa_strona = func(tab[liczba_elementow // 2 : ], liczba)
         
         return lewa_strona + prawa_strona
        

Pozdrawiam,

Nelson

komentarz 19 stycznia 2021 przez mokrowski Mędrzec (155,460 p.)
return tab.count(liczba)

I to jest rekurencja?

komentarz 19 stycznia 2021 przez Nelson89 Dyskutant (7,720 p.)

To nie jest rekurencją:

return tab.count(liczba)

Cała funkcja jest rekurencyjna, a nie poszczególne fragmenty. Ten fragment, to ostatni poziom zagnieżdżenia rekurencyjnego - jak funkcja dojdzie do tego momentu, to będą zwracane wartości do wyższych poziomów. Do tego najniższego poziomu dochodzi tylko tablica zawierająca jeden element, zatem wyrażenie tab.count(liczba) da wartość 0 lub 1.

komentarz 19 stycznia 2021 przez mokrowski Mędrzec (155,460 p.)

A dlaczego nie:

tab[0] == liczba

?

Poza tym podziały tworzą tylko niepotrzebny mętlik.

komentarz 19 stycznia 2021 przez Nelson89 Dyskutant (7,720 p.)

Myślę, że mój zapis jest ok przy uwzględnieniu, że ten kod ma 9 linijek, a w linijce nad returnem można znaleźć ifa, który sprawdza czy liczba elementów tablicy jest równa jeden. Gdyby po tym ife więcej rzeczy się działo, to oczywiście Twój zapis poprawiłby czytelność. Przy przeszukiwaniu, sortowaniu tablicy, myślę, że dzielenie jej na części nie jest złym pomysłem.

komentarz 19 stycznia 2021 przez mokrowski Mędrzec (155,460 p.)
#!/usr/bin/env python3

def szukaj1(tab, liczba, licznik = 0):
    if len(tab) == 0:
        return licznik
    elif tab[-1] == liczba:
        licznik += 1
    return szukaj1(tab[:-1], liczba, licznik)

def szukaj2(tab, liczba, licznik = 0):
    if len(tab) == 0:
        return licznik
    return szukaj2(tab[:-1], liczba, licznik + int(tab[-1] == liczba))

def szukaj3(tab, liczba, licznik = 0):
    return licznik if len(tab) == 0 else szukaj3(tab[:-1], liczba, licznik + int(tab[-1] == liczba))

if __name__ == '__main__':
    tab = [1, 3, 4, 3, 2, 1]
    testy = ((3, 2), (1, 2), (4, 1), (7, 0))
    for funkcja in (szukaj1, szukaj2, szukaj3):
        print(f"{funkcja.__name__}(...)")
        for liczba, rezultat in testy:
            wynik = (funkcja(tab, liczba) == rezultat)
            print(f"{liczba} {rezultat} {wynik}")

 

Podobne pytania

0 głosów
2 odpowiedzi 759 wizyt
pytanie zadane 2 października 2020 w C i C++ przez madbull Początkujący (270 p.)
0 głosów
1 odpowiedź 1,215 wizyt
pytanie zadane 11 listopada 2017 w C# przez ewa97 Nowicjusz (170 p.)
+1 głos
0 odpowiedzi 1,367 wizyt
pytanie zadane 4 listopada 2017 w C# przez ewa97 Nowicjusz (170 p.)

92,452 zapytań

141,262 odpowiedzi

319,080 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...