何时/如何停止在嵌套数组中创建嵌套数组的Ruby循环

时间:2015-08-21 00:21:03

标签: arrays ruby loops

我不确定何时结束运行map语句的循环,时间只是作为循环应该在哪里以及应该包含哪些代码的示例。我想运行它,直到创建的多维数组的第一个值为0(因为它将一直是最大的值,直到它自己变为0并创建最后一个嵌套数组),但我完全不知道如何这样做。任何帮助将不胜感激!

 dataset = data;
var stack = d3.layout.stack();
stack(dataset);

var x= d3.scale.ordinal()
        .domain(d3.range(dataset[0].length))
        .rangeRoundBands([0, w]);

var y= d3.scale.linear()
        .domain([0, 1])
        .range([0, h]);

var svg = d3.select("body")
        .append("svg")
        .attr("width", w)
        .attr("height", h);

var groups = svg.selectAll("g")
                .data(dataset)
                .enter()
                .append("g");

var rects = groups.selectAll("rect")
                .data(function (d) {
                    return d;
                })
                .enter()
                .append("rect")
                .attr("x", function (d, i) {
                    return x(i);
                })
                .attr("y", function (d) {
                    return y(d.y0 + d.y);
                })
                .attr("height", function (d) {
                    return h - y(d.y0);
                })
                .attr("width", x.rangeBand())
                .attr("fill", function (d, i) {
                    return color(i);
                });

问题:

def wonky_coins(n)
    coins = [n]
    if n == 0
        return 1
    end
    i = 1
    n.times do 
        coins.map! do |x|
        if x != 0
            i+= 2 
        else
            next
        o = []    
        o << x/2 
        o << x/3 
        o << x/4
        x = o
        puts x
        end
        end
    end
        return i
end

wonky_coins(6)

2 个答案:

答案 0 :(得分:1)

首先,你不应该有嵌套数组。你想在每次传球后弄平数组,所以你只需要硬币;更好的是,使用flat_map一步完成。 0只生成自己:[0];不要忘记它或你的代码将失去你所有的目标硬币!

接下来,我可以看到n次这样做没有逻辑。没有固定数量的times会这样做。你想要做until所有硬币都是零。您可以在顶部设置一个标志(all_zero = true),并在找到非零硬币时将其翻转,这应该告诉您的循环需要进一步的迭代。

此外,您不需要跟踪硬币数量,因为该数字将是数组的最终size

最后,与问题无关,确实养成使用正确缩进的习惯。首先,它使您自己更难调试和维护代码;另一方面,糟糕的缩进使很多SO人不想费心阅读你的问题。

答案 1 :(得分:0)

稍后再回来了解如何使用.flatten,我明白了!感谢@Amadan的有用提示。在我刚刚开始时,请随意留下关于我的语法的任何评论,并且可以使用我能得到的所有建设性反馈!

def wonky_coins(n)
    coins = [n]
    return 1 if n == 0
    until coins[0] == 0
        coins.map! { |x|
            next if x == 0 
            x = [x/2, x/3, x/4]
        }
        coins.flatten!
    end
    return coins.length
end

wonky_coins(6)