Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
在C++;我们有参考资料,但在Java中,我们如何做到最好;翻译;同一个代码是否按值复制?_Java_Algorithm_Oop_Design Patterns_Recursion - Fatal编程技术网

在C++;我们有参考资料,但在Java中,我们如何做到最好;翻译;同一个代码是否按值复制?

在C++;我们有参考资料,但在Java中,我们如何做到最好;翻译;同一个代码是否按值复制?,java,algorithm,oop,design-patterns,recursion,Java,Algorithm,Oop,Design Patterns,Recursion,也许我只是对什么都不清楚,但下面是: 在许多情况下,我们有一个递归算法,当我们从一个递归移动到下一个递归时,我们需要的值会被修改。 示例可以是minmaxmaxNoOfNodes等 在C++中,可以将各种参数作为参考,所有的工作都可以。 但在Java中,这不起作用,因为所有内容都是按值复制的,因此必须为参数创建一个额外的类作为持有者,以便在函数中修改参数。 因此,在C++中: int findLargestSeq(Tree*p、int&min、int&max、Tree*&seqTree) 无法像

也许我只是对什么都不清楚,但下面是:

在许多情况下,我们有一个递归算法,当我们从一个递归移动到下一个递归时,我们需要的值会被修改。
示例可以是
min
max
maxNoOfNodes

在C++中,可以将各种参数作为参考,所有的工作都可以。 但在Java中,这不起作用,因为所有内容都是按值复制的,因此必须为参数创建一个额外的类作为持有者,以便在函数中修改参数。
因此,在C++中:

int findLargestSeq(Tree*p、int&min、int&max、Tree*&seqTree)

无法像Java中那样“翻译”,但必须像:
int findLargestSeq(树p,参数p)

其中,
Params
将封装要更新的
min
max

我想知道这是唯一的办法吗?
对于这种算法,Java中是否有更“干净”的方法或标准模式

我想,也许我们修改C++中作为参数引用的参数是一个遗留在C编程中的习惯,而在爪哇,这是纯O,我也被困在这个“程序化”的方式中,并且不能看到我应该以某种方式处理不同类型的问题。p>


任何输入都是非常受欢迎的

在Java中,所有内容都是复制的。然而,除了原语(int、boolean、char等),其他一切都是指针

在Java中,如果要返回多个值,可以创建一个包含多个值的聚合器类。如果您确实想要一个void方法,或者一个由该方法修改给定参数以返回结果的方法,您可以使用该模式。


使用原子引用模板。它看起来很难看,很长,但我认为这会给你你想要的行为。

在Java中,你传递的不是一个值的副本,而是一个引用的副本

您不能通过让引用指向方法中的另一个对象来更改引用,但是-如果对象有方法修改它-修改被引用的对象

void failToModify (Foo foo) {
    foo = new Bar (); // Useless
}

void modify (Foo foo) {
    foo.setFoo (new Bar ()); 
}
请注意,这与阵列一致:

void failToModify (int[] ia) {
    ia = {3, 4, 5}; // No influence for the caller
}

void modify (int[] ia) {
    ia[0] = 3;
    ia[1] = 4;
    ia[2] = 5;
}
还有内置类型:

void failToModify (int a) {
    a = 8; // No influence for the caller
}

void modifyImpossible (int a) {
    --a; 
    // a build in type is immutable. 
    // You can't modify 8 to be 7.
    // Only the local copy of the reference is decremented.
}

modifyImpossible (8);
int a = 7;
failToModify (a);

剩下的两种可能性是:要么修改参数(如果它不是不可变的),要么返回一个新的对象。在递归方法中,您可以将sofar对象从一步传递到另一步(例如minSofar)。

当算法复杂到需要递归调用才能修改状态变量时,然后一个非常简单的解决方案是在类中使用私有字段。

Java更喜欢使用对象,它只支持对对象的引用,而不支持原语

重新融合的一种方式

int findLargestSeq(Tree *p, int &min, int &max,Tree *& seqTree)

可以称之为

Tree p = ...
int[] min = { 0 };
int[] max = { Integer.MAX_VALUE };
Tree[] seqTree = { tree };

int ret = findLargestSeq(p, min, max, seqTree);

是的,我知道。但这不是我要问的。你写了
,因为所有东西都是按值复制的,这不是正确的表达式。也许我最后的修改/段落仍然没有回答你的问题-它不是最清晰的一个。你可能对
抄袭表达的不准确性是正确的。我理解你所说的,我理解你提到的这些微妙之处。我要寻找的是在设计中是否有一个更清晰/标准的方法在不使用额外对象的情况下处理这些问题的算法只是作为包装器来解决您在回答中正确提到的问题。现在这更清楚了吗?我的意思是与我在OP中的担忧有关吗?还不清楚“包装器”指的是什么,以及代码看起来应该被替换。对我来说,不清楚
int-findLargestSeq(Tree*p,int&min,int&max,Tree*&seqTree)
应该如何在内部工作,也不清楚
int-findLargestSeq(Tree p,Params p)
会是什么样子。如果你展示了一个真实的算法,你可以编写一个替代的实现。在当前状态下,这是一个猜测游戏。但是为什么这会让您感到困惑呢?
findLargestSeq
的内部是不相关的。相关的是
min
max
seqTree
在每个函数调用中都会更新,实际上函数中的更改会反映给调用方
min
应该是另一个类的成员,以便调用方“查看”任何对我的更新。这个类只作为我的包装+1服务,但我不喜欢jax-ws中使用的
Holder
。它可能适合像jax-ws这样的通用框架,但对于算法我看不到它的有用性。例如,如果我需要修改OP中的
min
,并且是一个整数,我不想使用它
generic
holder+1,因为它是一种有趣的方法。但是方法声明是否会让读者感到困惑,因为它暗示了一系列值(数组)?而且意图并不明显。在代码清晰性方面更糟糕?我同意,除非您知道
[]
是一种解决方法。我会使用您提到的方法,将它们作为对象传递。代码演化:从Lawrey方法开始。仅当额外的复杂性得到证明时,才移动到user384706方法。代码的读者只会被不必要的复杂性弄糊涂。一类“参数”?拜托。如果这是所有必要的,为什么程序员不使用指针的标准习惯用法(Lawrey方法)?另一方面,如果您需要指向泛型类型的指针,user384706方法将是最好的选择。但是程序员应该为这些类使用一个平淡的、听起来像“包装器”的通用名称。在拥有自己的MetNodes后使用描述性类名您的意思是创建算法的对象吗?您也可以在同一个类中打包不同的算法或功能,但在某些ca中
Tree p = ...
int[] min = { 0 };
int[] max = { Integer.MAX_VALUE };
Tree[] seqTree = { tree };

int ret = findLargestSeq(p, min, max, seqTree);