5

この問題で再帰を使用する方法を理解しようとして問題が発生しています。これまでに知っている言語はRubyだけなので、Rubyを使用して解決しています。

他の会社を所有している会社のハッシュがいくつかあります。

@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 }

たとえば['A','B'] => 0.5、会社「A」が「B」の0.5(50%)を所有していることを意味します。問題は、特定の会社が他の会社を所有することによって(直接的および間接的に)所有している会社の量を決定できる方法を定義することです。私がこれまでに決定したこと:

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

これにより、企業が直接所有する一連の企業が返されます。これが、total_ownershipメソッドがどのようになるかを私が考えていることです。

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

この例のために、私たちが探していると仮定しましょうtotal_ownership('A','E')

明らかに、これは機能しません。私が本当に理解できないのは、各再帰レベルの値を「保存」する方法と、ベースケースを正しく設定する方法です。あなたがRubyでそれを手伝うことができないなら、私も擬似コードを気にしません。

4

2 に答える 2

2

うーん、そうあるべきだと私には思えます

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
于 2012-04-15T23:00:03.793 に答える
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
于 2012-04-15T23:04:42.017 に答える