当我使用Ruby递归时,为什么我不能得到正确的答案?

时间:2017-06-24 08:04:48

标签: java ruby algorithm recursion

我使用Java创建了一个代码片段,如下所示。这是从nCr获得所有组合的代码。

code using recursion with Java,在线编译器

Java版

select_related

接下来,我尝试用Ruby移植它。但是,它不能很好地工作 你能指出两个代码片段之间的问题是什么吗?

code using recursion with Ruby,在线编译器

Ruby版

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.HashSet;

public class prog {

    public static void main(String[] args) {

        // nCr : n=[1,2,3,4,5],r=3
        ArrayList<Integer> n = new ArrayList<>(Arrays.asList(1,2,3,4,5));
        getCombination(n,3);
    }

    private static Set<ArrayList<Integer>> getCombination(ArrayList<Integer> n, Integer r) {
        Set<ArrayList<Integer>> ans = new HashSet<ArrayList<Integer>>();
        combination(n, r, ans);
        for (ArrayList<Integer> e : ans) {
            System.out.println(e.toString());
        }
        return ans;
    }

    private static void combination(ArrayList<Integer> n, Integer r, Set<ArrayList<Integer>> ans) {
        if (n.size() == r) {
            ans.add(n);
            return;
        }
        for (int i = 0; i < n.size(); i++) {
            ArrayList<Integer> N = new ArrayList<Integer>();
            N.addAll(n);
            N.remove(i);
            combination(N,r,ans);
        }
    }
}

我知道ruby有require 'set' def combi(n, r, ans) if n.size == r ans.add(n) return end for i in 0..n.size arr = n.dup arr.delete_at(i) combi(arr, r, ans) end end def get_combination(n, r) ans = Set.new combi(n, r, ans) #ans.map do |e| # puts e.to_s #end ans end n1 = [1,2,3,4,5] get_combination(n1, 3) 方法,但这不是问题。

1 个答案:

答案 0 :(得分:2)

在这部分:

Number of predicates: 9  
noun   
non-noun   
non-noun 
你的红宝石cody,你包括在内。这必须专门用'...'制作代码

for i in 0..n.size
    arr = n.dup
    arr.delete_at(i)
    combi(arr, r, ans)
end

然后你的代码工作正常!