Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用回溯的置换程序在Ruby中不起作用_Java_Ruby_Algorithm - Fatal编程技术网

Java 使用回溯的置换程序在Ruby中不起作用

Java 使用回溯的置换程序在Ruby中不起作用,java,ruby,algorithm,Java,Ruby,Algorithm,我对Ruby编程相当陌生,我正在尝试编写一个Ruby代码,它将按照一定的顺序获取一个数字列表,并将返回一个排列列表中所有可能的排列。不久前,我用Java成功地编写了这个程序,它工作正常。当我试图用Ruby实现相同的逻辑时,我得到的只是一个空列表列表,而不是排列。通过最初的调试,我可以观察到每个排列都是通过回溯方法在temp_列表中成功构建的,但不知何故res没有正确地保留推送的排列。我认为我在Ruby中的编码风格有问题。有人能指出问题所在吗。我附上了我的Ruby和Java代码 我的Ruby代码如

我对Ruby编程相当陌生,我正在尝试编写一个Ruby代码,它将按照一定的顺序获取一个数字列表,并将返回一个排列列表中所有可能的排列。不久前,我用Java成功地编写了这个程序,它工作正常。当我试图用Ruby实现相同的逻辑时,我得到的只是一个空列表列表,而不是排列。通过最初的调试,我可以观察到每个排列都是通过回溯方法在temp_列表中成功构建的,但不知何故res没有正确地保留推送的排列。我认为我在Ruby中的编码风格有问题。有人能指出问题所在吗。我附上了我的Ruby和Java代码

我的Ruby代码如下:

# @param [Object] nums : List of numbers Example: [1, 2, 3]
# @return [Object] res : List of all permutation lists Example [[1, 2, 3], [1, 3, 2]....]
def permute(nums)
  res = []
  temp_list = []
  backtrack(res, temp_list, nums)
  res
end

# @param [Object] res : List of all permutation lists Example [[1, 2, 3], [1, 3, 2]....]
# @param [Object] temp_list : List of permutation which is being built
# @param [Object] nums : Original nums list given to the permute method
def backtrack(res, temp_list, nums)
  if temp_list.size == nums.size
    res << temp_list
  else
    nums.each do |n|
      next if temp_list.include? n
      temp_list << n
      backtrack(res, temp_list, nums)
      temp_list.pop
    end
  end
end
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Srikiran Sistla on 4/3/2017.
 */
public class Q46 {
    public List<List<Integer>> permute(int[] num) {
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> tempList = new ArrayList<>();
        backtrack(res, tempList, num);
        return res;
    }

    private void backtrack(List<List<Integer>> res, List<Integer> tempList, int[] num) {
        if (tempList.size() == num.length) res.add(new ArrayList<>(tempList));
        else {
            for (int n : num){
                if (tempList.contains(n)) continue;
                tempList.add(n);
                backtrack(res, tempList, num);
                tempList.remove(tempList.size()-1);
            }
        }
    }
}
#@param[Object]nums:数字列表示例:[1,2,3]
#@return[Object]res:所有排列列表的列表示例[[1,2,3],[1,3,2]…]
def置换(nums)
res=[]
临时列表=[]
回溯(资源、临时列表、NUM)
物件
结束
#@param[Object]res:所有排列列表的列表示例[[1,2,3],[1,3,2]…]
#@param[Object]临时列表:正在生成的置换列表
#@param[Object]nums:提供给permute方法的原始nums列表
def回溯(res、temp_列表、nums)
如果temp_list.size==nums.size

res是wierd,但我已经解开了你的密码:)

您需要的只是在将临时列表附加到res之前克隆临时列表:

res[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

很奇怪,但我已经解开了你的密码:)

您需要的只是在将临时列表附加到res之前克隆临时列表:

res[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

如果这不是一个学术练习,你可以一直做[1,2,3]。排列。to_aIt只是“Ruby”和“Java”。它们不是首字母缩略词,也不是全大写。如果这不是一个学术练习,你可以一直做[1,2,3]。排列。to_aIt只是“Ruby”和“Java”。它们不是首字母缩略词,也不是全大写。非常感谢!你的简单技巧真的很有魅力!:)谢谢你让我知道排列。非常感谢!你的简单技巧真的很有魅力!:)谢谢你让我知道关于排列的事。to_a