2017-01-11 6 views
1

Pythonでコードを書いたところ、実際にうまく動作し、Javaで実装しようとしていましたが、少し問題があります。PythonコードからJavaコードへの変換

def twentyone(nums, stack = [], answer = set()): 
    for index, num in enumerate(nums): 
     new_stack = stack + [num] 
     total = sum(new_stack) 
     if total == 21: 
      answer.add(tuple(new_stack)) 
     elif total < 21: 
      twentyone(nums[index + 1:], new_stack, answer) 
    return answer 

user_input = input() 
list_format = [int(x) for x in user_input.split()] 
answer = twentyone(list_format) 

if len(answer) == 0: 
    print("No combination of numbers add to 21") 
for solution in answer: 
    print("The values ", end = "") 
    for number in solution: 
      print("{} ".format(number), end = "") 
    print("add up to 21") 

、ここでは私のJavaコードは(今のところ)である:それは、このような「1 9 10」として、ユーザからの文字列の入力を受け取り、バックトラッキングを使用して、簡単な21の質問ここで

は、Pythonのコードです

public class TwentyOne { 

    public static void main(String args[]){ 
     Scanner userInput = new Scanner(System.in); 
     String stringInput = userInput.nextLine(); 

     ArrayList<Integer> allNum = new ArrayList<>(); 
     for (String num : stringInput.split(" ")){ 
     allNum.add(Integer.parseInt(num)); 
     } 

     HashSet<ArrayList<Integer>> answer = twentyOne(allNum); 

     for (ArrayList<Integer> solution : answer){ 
     System.out.print("The values "); 
     for (Integer num : solution){ 
      System.out.print(num + " "); 
     } 
     System.out.println("Add up to 21"); 
     } 
    } 



    private static HashSet twentyOne(ArrayList<Integer> user_input){ 

     return new HashSet<ArrayList<Integer>>(); 
    } 
} 

基本的に、変数の初期化を行わずにJavaの再帰問題を書くことはできません。

すなわちdef twentyone(nums, stack = [], answer = set()):

だから私の質問は、私は、私が上の再帰呼び出しを行うことになるメソッド内の変数の初期化せずにJavaのバックトラックに対処するか、どのようにでしょうか?

+0

問題:関数を呼び出す前にそれらを初期化しますか? – Idos

+0

しかし、関数呼び出しの前にスタックを宣言してオブジェクト属性にすると、各再帰インスタンスではスタックは同じではありませんか?私は、それぞれの再帰呼び出しの各スタックが異なる必要があります。 多分私はあまりにも多くのpythonをやったことがあります、それを動作させるために私のJavaコードで何を教えてくれますか? – user7404408

答えて

0

デフォルトの引数を渡すラッパーメソッドを記述します。例:

twentyone(List<Integer> nums) { 
    twentyoneRecursive(nums, new ArrayDeque<>(), new HashSet<>()); 
} 

twentyoneRecursive(List<Integer> nums, Deque<Integer> stack, Set<List<Integer>> answer) { 
    ... 
    twentyoneRecursive(...); 
} 
+0

前にDeque を見たことがない、私はそれを見なければならないだろうが、これは有望な方法のように見える:D – user7404408

+0

@ user7404408上記のあなたのコメントに関して、私は多くのpythonをやっていないが、 stack + [num] 'と' nums [index + 1:] 'はそれらのリストのコピーを作成します。 Javaには演算子のオーバーロードはなく、 'list.append'と同等の機能しかありません。後者の場合は、['List.subList()'](https://docs.oracle.com/javase/8/docs/api/java/util/List.html#subList-int-int-)を使用することができます。あなたが読んでいるからです。しかし、スタックの場合、コピーを作成してから追加操作を行う必要があります。 –

+0

更新:完了、ここに私の結果へのリンクです。 https://github.com/AmbushSta/javaProjects/blob/master/21UsingRecursion.java ご協力ありがとうございます。 – user7404408

関連する問題