2012-04-15 55 views
5

Tôi đang gặp sự cố khi cố gắng hiểu cách sử dụng đệ quy với sự cố này. Tôi đang sử dụng Ruby để giải quyết nó bởi vì đó là ngôn ngữ duy nhất tôi biết cho đến nay!Giải thuật cây/Thuật toán đệ quy

Bạn có một số hash của các công ty sở hữu các công ty khác:

@hsh = { ['A','B'] => 0.5, ['B','E'] => 0.2, ['A','E'] => 0.2, 
     ['A','C'] => 0.3, ['C','D'] => 0.4, ['D','E'] => 0.2 } 

Ví dụ ['A','B'] => 0.5 có nghĩa là công ty 'A' sở hữu 0,5 (50%) 'B' Câu hỏi đặt ra là xác định một phương pháp mà cho phép bạn xác định bao nhiêu của một công ty một công ty cụ thể sở hữu (trực tiếp và gián tiếp) thông qua việc sở hữu các công ty khác. Những gì tôi đã xác định cho đến thời điểm này:

def portfolio(entity) 
    portfolio = [] 
    @hsh.keys.each do |relationship| 
    portfolio << relationship.last if relationship.first == entity 
    end 
    portfolio 
end 

Điều này trả về một mảng các công ty trực tiếp sở hữu. Bây giờ, đây là những gì tôi đang nghĩ phương pháp total_ownership sẽ như thế nào.

def total_ownership(entity, security) 
    portfolio(entity).inject() do |sum, company| 
    sum *= @hsh[[entity,company]] 
    total_ownership(company,security) 
    end 
end 

Vì lợi ích của ví dụ này chúng ta hãy giả sử chúng ta đang tìm kiếm total_ownership('A','E')

Rõ ràng, điều này không làm việc. Những gì tôi có thể không thực sự tìm ra là làm thế nào để "lưu trữ" các giá trị của mỗi cấp đệ quy và làm thế nào để thiết lập các trường hợp cơ sở chính xác. Nếu bạn không thể giúp tôi với nó trong Ruby, tôi cũng không quan tâm đến mã giả.

+3

+1 Thú vị câu hỏi. Nếu đó là bài tập về nhà, nó phải được dán nhãn như vậy. – steenslag

+1

Chỉ cần xác nhận, giải pháp cho total_ownership ('A', 'E') là (0.5 * 0.2) + 0.2 + (0.3 * 0.4 * 0.2)? – sunnyrjuneja

+0

Không! Chỉ là một vấn đề tôi đã tự hỏi làm thế nào để giải quyết trong khi suy nghĩ về đệ quy. Cảm ơn cho tip mặc dù –

Trả lời

2

Hmm, dường như đối với tôi nó phải được

def total_ownership(entity, security) 
    indirect = portfolio(entity).inject(0) do |sum, company| 
    share = @hsh[[entity, company]] 
    sum + (share || 0) * total_ownership(company,security) 
    end 
    direct = @hsh[[entity, security]] || 0 

    indirect + direct 
end 
+0

Cảm ơn rất nhiều sự giúp đỡ; nó có ý nghĩa hơn bây giờ –

+1

Bây giờ cho thử thách tiền thưởng. Điều gì sẽ xảy ra nếu công ty A sở hữu công ty B sở hữu danh mục cổ phiếu bao gồm một số công ty A? Mã của bạn phá vỡ ... – btilly

+0

Đúng, mặc dù câu hỏi không đề cập đến "cây" ... –

1
def total_ownership(a, b) 
    direct_ownership(a, b) + indirect_ownership(a, b) 
end 

def direct_ownership(a, b) 
    @hsh[[a, b]] || 0 
end 

def indirect_ownership(a, b) 
    portfolio(a).map do |portfolio_item| 
    @hsh[[a, portfolio_item]] * total_ownership(portfolio_item, b) 
    end.inject(&:+) || 0 
end 
+0

Cảm ơn các phương pháp thay thế là tốt! –

Các vấn đề liên quan