[Ruby]Probleem met een array recursief doorlopen

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • telefoontoestel
  • Registratie: Oktober 2002
  • Laatst online: 29-06-2024

telefoontoestel

Maak me gelukkig....Bel!!

Topicstarter
Ik ben bezig met een opdracht in Ruby. Hiervoor heb ik een aantal functies gemaakt die twee array's met elkaar vergelijkt en er een mapping van maakt (wordt gebruikt om termen te vervangen indien een formule wordt ingegeven). Nu wil het probleem dat de lijst met regels (param x) waar aan voldaan moet worden en de lijst die gematcht moet worden (param s_exp), recursief worden gestript en daardoor niet kunnen worden hergebruikt. De enige manier die ik ook kan vinden is namelijk door het gebruik van shift, maar doordat het by reference werkt blijft er op de originele arrays niets meer staan.

Ik dacht zelf handig te zijn en Marshal.load te combineren met Marshal.dump en zodoende een echte kopie te maken van de arrays voordat ermee wordt gewerkt, maar hierdoor kom ik in een endless recursion en faalt de uitvoer. Ik ben zelf absoluut niet gewend aan deze manier van programmeren en ben er al een paar weken naar aan het staren en kom er totaal niet meer uit.

Ik ben opzoek naar een aanwijzing om ervoor te zorgen dat de initiële array weer kan worden hersteld of mogelijk een alternatief voor shift, zodat het wel recursief gebruikt kan blijven worden maar weer wordt hersteld zodra het klaar is.

Ruby:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
def match(x, s_exp)
    match_rec(x, s_exp, {})
end

#
# Auxiliary methods for match
#
def match_rec(x, s_exp, m) 
    if x.kind_of?(Array) && s_exp.kind_of?(Array) then
        return match_array(x, s_exp, m)
    elsif variable?(x) then
        return match_var(x, s_exp, m)
    elsif x == s_exp then
        return m
    else 
        return nil
    end
end

def match_var(x, s_exp, m)
    if (m.has_key? x) then
        m = match_rec(m[x], s_exp, m)
    else
        m[x] = s_exp
    end
    
    return m
end

def match_array(x, s_exp, m)
    if x.kind_of?(Array) && !x.empty? && s_exp.kind_of?(Array) && !s_exp.empty? then
        m_rec = match_rec(x.shift, s_exp.shift, m)
        
        if !m_rec.nil? then
            match_array(x, s_exp, m_rec)
        end
    end
    
    if x.empty? && s_exp.empty? then
        return m
    end
    
    return nil
end

telefoontoestel