Python代码到Java代码的转换

Python代码到Java代码的转换,java,python,recursion,backtracking,Java,Python,Recursion,Backtracking,我用python编写了一些代码,效果非常好,我试图用Java实现它,但遇到了一些小问题。这是一个简单的21题,使用回溯,从用户处获取字符串输入,如“1 9 10” 以下是python代码: def twentyone(nums, stack = [], answer = set()): for index, num in enumerate(nums): new_stack = stack + [num] total = sum(new_stack)

我用python编写了一些代码,效果非常好,我试图用Java实现它,但遇到了一些小问题。这是一个简单的21题,使用回溯,从用户处获取字符串输入,如“1 9 10”

以下是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")
def twentyone(nums,stack=[],answer=set()):
对于索引,枚举中的num(nums):
新堆栈=堆栈+[num]
总计=总和(新的_堆栈)
如果总数=21:
添加(元组(新的_堆栈))
elif总计<21:
二十一(nums[index+1:],新堆栈,答案)
回覆
用户输入=输入()
list_format=[user_input.split()中x的int(x)]
答案=21(列表格式)
如果len(答案)==0:
打印(“无数字组合添加到21”)
关于答案中的解决方案:
打印(“值”,end=“”)
对于解决方案中的数字:
打印(“{}”。格式(数字),结束=”)
打印(“总计21”)
这是我的java代码(到目前为止)

公共类二十一{
公共静态void main(字符串参数[]){
扫描仪用户输入=新扫描仪(System.in);
String stringInput=userInput.nextLine();
ArrayList allNum=新的ArrayList();
for(字符串编号:stringInput.split(“”){
add(Integer.parseInt(num));
}
HashSet-answer=21(allNum);
for(ArrayList解决方案:答案){
系统输出打印(“值”);
for(整数编号:解决方案){
系统输出打印(num+“”);
}
System.out.println(“总计21”);
}
}
私有静态哈希集二十一(ArrayList用户输入){
返回新的HashSet();
}
}
基本上,如果参数中没有变量初始化,我就无法编写java递归问题

i、 e
deftwentyone(nums,stack=[],answer=set()):


因此,我的问题是,在我将对其进行递归调用的方法中,如何在没有变量初始化的情况下处理java回溯?

您将编写一个传递默认参数的包装器方法。e、 g:

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

twentyoneRecursive(List<Integer> nums, Deque<Integer> stack, Set<List<Integer>> answer) {
    ...
    twentyoneRecursive(...);
}
twentyone(列表NUM){
twentyoneRecursive(nums、新ArrayQue()、新HashSet());
}
Twenty-OneRecursive(列出NUM、数据堆栈、设置答案){
...
二十名执行者(…);
}

您将编写一个传递默认参数的包装器方法。e、 g:

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

twentyoneRecursive(List<Integer> nums, Deque<Integer> stack, Set<List<Integer>> answer) {
    ...
    twentyoneRecursive(...);
}
twentyone(列表NUM){
twentyoneRecursive(nums、新ArrayQue()、新HashSet());
}
Twenty-OneRecursive(列出NUM、数据堆栈、设置答案){
...
二十名执行者(…);
}

有什么问题吗?在调用函数之前初始化它们?但是如果我在调用函数之前声明一个堆栈,并将其作为对象属性,那么在每个递归实例中,堆栈不是相同的吗?我需要每个递归调用中的每个堆栈都是不同的。也许我做了太多的python,你能告诉我java代码中有什么东西可以让它工作吗?有什么问题吗?在调用函数之前初始化它们?但是如果我在调用函数之前声明一个堆栈,并将其作为对象属性,那么在每个递归实例中,堆栈不是相同的吗?我需要每个递归调用中的每个堆栈都是不同的。也许我做了太多python,你能告诉我java代码中有什么东西可以让它工作吗?我以前没有见过Deque,我必须研究一下,但这看起来是一个很有前途的方法,谢谢:D@user7404408关于上面的评论,我没有做太多的python,但是我认为调用
stack+[num]
以及
nums[索引+1:]
创建这些列表的副本。虽然Java没有运算符重载,只是具有与
list.append相当的功能。对于后一种情况,您可以使用,因为您仅从中读取。但是对于堆栈情况,您必须创建一个副本,然后执行添加操作。更新:已完成,这是指向我的结果的链接。t谢谢你的帮助。我以前没见过德克,我得研究一下,但这看起来是个很有前途的方法。谢谢:D@user7404408关于上面的评论,我没有做太多的python,但我认为调用
stack+[num]
以及
nums[index+1:]
创建这些列表的副本。虽然Java没有运算符重载,只是具有与
list.append相当的功能。对于后一种情况,您可以使用,因为您仅从中读取。但是对于堆栈情况,您必须创建一个副本,然后执行添加操作。更新:已完成,这是指向我的结果的链接。t谢谢你的帮助。