2017-01-11 2 views
1

J'ai écrit du code en python qui fonctionne très bien et j'essayais de l'implémenter en Java et j'ai quelques légers problèmes. Il est un simple 21 question à l'aide retours en arrière qui prend une entrée de chaîne de l'utilisateur tel que « 1 9 10 »Conversion du code Python en Java

Voici le code python:

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") 

et voici mon code java (jusqu'à présent) Fondamentalement, je ne peux pas contourner écrire des problèmes de récurrence java sans initialisation variable dans les paramètres.

i.e. def twentyone(nums, stack = [], answer = set()):

Ma question est, comment puis-je traiter avec java sans retours en arrière initialisation variable dans la méthode que je vais faire les appels récursifs sur?

+0

Quel est le problème? Initialiser les avant d'appeler la fonction? – Idos

+0

Mais si je déclare une pile avant l'appel de la fonction et en fait un attribut d'objet, dans chaque instance récursive, la pile ne serait-elle pas la même? J'ai besoin que chaque pile de chaque appel récursif soit différente. Peut-être que j'ai fait trop de python, pourriez-vous me dire quoi dans mon code java pour que ça marche? – user7404408

Répondre

0

Vous devez écrire une méthode wrapper qui transmet les arguments par défaut. par exemple:

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

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

Je n'ai pas vu de Deque auparavant, je vais devoir regarder cela mais cela ressemble à une méthode prometteuse merci: D – user7404408

+0

@ user7404408 En ce qui concerne votre commentaire ci-dessus, je n'ai pas fait trop de python, mais je pense appeler ' stack + [num] 'ainsi que' nums [index + 1:] 'crée des copies de ces listes. Alors que Java n'a pas de surcharge d'opérateur et a juste l'équivalent de 'list.append'. Pour ce dernier cas, vous pouvez utiliser ['List.subList()'] (https://docs.oracle.com/javase/8/docs/api/java/util/List.html#subList-int-int-) , puisque vous en lisez seulement. Mais pour le cas de la pile, vous devez créer une copie, puis effectuer l'opération d'ajout. –

+0

Mise à jour: Complété, voici le lien vers mon résultat. https://github.com/AmbushSta/javaProjects/blob/master/21UsingRecursion.java Merci pour votre aide. – user7404408