ypq: (Default)
[personal profile] ypq
программа на ruby расчета сопротивления разных вариантов распайки набора из N деталей.
#!/usr/local/bin/ruby --
#
reslist = Hash[“1”, 1.0, “2”, 2.0, “3”, 3.0, “4”, 4.0, “5”, 5.0]

def f(reslist)
    y = Hash.new
    yy = Hash.new
    if reslist.length == 1
        reslist.each { |n,v|
            print n + ‘=’ + v.to_s + “\n”
        }
        return 0
    elsif reslist.length == 2
        x = reslist.to_a
        n = ‘(’ + x[0][0] + ‘+’ + x[1][0] + ‘)’
        v = x[0][1] + x[1][1]
        y.clear
        y[n] = v
        f(y)
        n = ‘(’ + x[0][0] + ‘|’ + x[1][0] + ‘)’
        v = (x[0][1]*x[1][1]) / (x[0][1]+x[1][1])
        y.clear
        y[n] = v
        f(y)
        y.clear
        return 0
    else
        reslist.each { |n,v|
            y = reslist.dup
            y.delete(n)
            f(y)          # чтоб считались варианты и с неиспользуемыми деталями
            y.each { |nn,vv|
                yy = y.dup
                yy.delete(nn)
                nnn = ‘(’ + n + ‘+’ + nn + ‘)’
                vvv = v + vv
                yy[nnn] = vvv
                f(yy)
                yy.clear
                yy = y
                yy.delete(nn)
                nnn = ‘(’ + n + ‘|’ + nn + ‘)’
                vvv = (v*vv)/(v+vv)
                yy[nnn] = vvv
                f(yy)
                yy.clear
            }
            y.clear
        }
    end
    return 0
end

f(reslist)


надо бы, конечно, отфильтровать одинаковые варианты...
зато с рекурсией.
люблю с рекурсией...
Page generated 2026-Feb-19, Thursday 18:44
Powered by Dreamwidth Studios