drzewo binarne kod morsa

0

Cześć, uczę się właśnie drzew binarnych i rekurencji, na przykładzie kodu morsa. Znalazlem kilka przykladow w necie ale nie dokonca spelniaja zalozenia mojego programu, siedze juz nad tym kilka dni i chyba potrzebuje waszej pomocy. Chce aby funkajca zwracala string z zakodowana litera, moj problem polega na tym ze nie potrafie przekazac stringa rekurencyjnie i 'zbudowac' odpowiedzi
funkcja ma przyjmowac dwa parametry i zwracac string
oto kod ktory strugam


def kodmorsa(tree: Tree, char: str) -> str:
  kod = ''
        if char.isupper() or char.isalpha() or not is_empty(tree) == False:
          return ''
        if tree.root == char:
          return True
        else:
           if kodmorsa(tree.left, char) == True:
              kod = kod + '.'
              return True
           elif kodmorsa(tree.right, chart == True:
              kod = kod + '-'
              return True
     

0

Brakuje reszty kodu - przykładowej definicji obiektu tree który podejesz - zakładam, że określa jak są kodowane litery?

W tym, co widać, przypisujesz do lokalnej zmiennej kod, która nie jest wspólna dla kolejnych wywołań. Powinieneś zwracać z funkcji kropkę lub kreskę połączoną z tym, co zwraca wywołanie rekurencyjne.

0

@Krzemień: drzewo wyglada jak standardowy kod morsa. Wlasnie problem w tym ze nie potrafie tego zaimplementowac, tego zwracania kropki lub kreski do zmiennej kod

screenshot-20220201214743.png

0
class Tree:
   
    def __init__(self):
        self.root = None
        self.left = None
        self.right = None
        
    def join(item: object, left: Tree, right: Tree) -> Tree:
    
    tree = Tree()
    tree.root = item
    tree.left = left
    tree.right = right
    return tree

EMPTY = Tree()
H = join('H',EMPTY,EMPTY)
V = join('V',EMPTY,EMPTY)
F = join('F',EMPTY,EMPTY)
L = join('L',EMPTY,EMPTY)
P = join('P',EMPTY,EMPTY)
J = join('J',EMPTY,EMPTY)
B = join('B',EMPTY,EMPTY)
X = join('X',EMPTY,EMPTY)
C = join('C',EMPTY,EMPTY)
Y = join('Y',EMPTY,EMPTY)
Z = join('Z',EMPTY,EMPTY)
Q = join('Q',EMPTY,EMPTY)
S = join('S',H,V)
U = join('U',F,EMPTY)
R = join('R',L,EMPTY)
W = join('W',P,J)
D = join('D',B,X)
K = join('K',C,Y)
G = join('G',Z,Q)
O = join('O',EMPTY,EMPTY)
I = join('I',S,U)
A = join('A',R,W)
N = join('N',D,K)
M = join('M',G,O)
E = join('E',I,A)
T = join('T',N,M)
MORSE = join('START',E,T)

tak wyglada drzewo

0

Są dwa problemy:

  1. Kodowanie litery np. 'U': skąd funkcja kodmorsa ma wiedzieć, że trzezba wybrać drzewo E, a nie T? Każdy węzeł drzewa powinien trzymać dodatkową zmienną określającą jakie litery zawiera, np. dla węzła I będzie to 'HSVIFU'. Można obliczać w funkcji join: tree.letters = left.letters + item + right.letters. (Albo wybrać stronę za pomocą rekurencji, spróbuj jak zadziała pierwszym sposobem)
    Edycja: wybieranie strony za pomocą rekurencji masz poprawnie. Powinieneś do tego zwracać kod, np. return (True, kod)
  2. kodmorsa nie powinna zwracać True, ale już znany fragment kodu, i sklejać tak, jak opisałem wcześniej. Koncepcyjnie wygląda to tak:
  • rekurencyjnie wchodzisz wgłąb drzewa
  • po dojściu do szukanej litery zwracasz (tzn. return) jeden symbol
  • wracając w stronę korzenia, łączysz kolejny symbol z już obliczonym fragmentem kodu i zwracasz go
0

@Krzemień: no i właśnie potrzebuje pomocy z 2 podpunktem nie potrafie tego tak zaimplementowac aby zwracalo - lub . Konceptualnie wiem co i jak rozumiem to tylko potrzebuje pomocy w implementacji

0
def kodmorsa(tree, char, code):
    if tree==None:
        return False
    elif tree.root==char:
        return True
    else:  
        if kodmorsa(tree.left,char, code)==True:
            code.insert(0,".")
            return True
        elif kodmorsa(tree.right,char, code)==True:
            code.insert(0,"-")
            return True

ta funkcja robi to czego oczekuje, tyko zalozenie jest takie ze ma przyjmowac dwa argumenty a nie trzy i zwracac stringa,

2

nie potrafie tego tak zaimplementowac aby zwracalo

Po prostu zwróć. tak naprawdę nie potrzebujesz nawet True, wystarczy kod albo None.

lewa = kodmorsa(...)
if lewa: return '.' + lewa
prawa = ...
if ...
return None
1

@Krzemień: w koncu sie udalo, boże co za meczarnia. Dziekuje panie Krzemień

0

@Credit: Hej, od tygodnia się męczę nad tym samym problemem i za cholerę nie mogę nic wymyślić. Wszystko inne na studiach jestem w stanie zakodować, tylko tego nie potrafię. Jak ci się udało to zrobić?

0

@Credit: Nieważne, jakoś mi się udało. Mój kod jest brzydki, ale działa. Tak w ogóle, to się zastanawiam, czy przypadkiem na tym samym uniwerku nie jesteśmy? OU?
@Krzemień: Dzięki, Nie za wiele rozumiem z twojej podpowiedzi, ale dzięki niej udało mi się to zrobić. Chyba muszę poćwiczyć rekurencję na spokojnie.

0

a teraz powiedz, czemu taka struktura nie jest odpowiednia do tego zadania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1