我对理解递归是如何工作有点困惑。
基本上我必须用非递归方法替换递归方法。
例如,这是递归方法:
public Key min() {
if (isEmpty()) {
return null;
}
return min(root).key;
}
private Node min(Node x) {
if (x.left == null) {
return x;
} else {
return min(x.left);
}
}
public Key max() {
if (isEmpty()) {
return null;
}
return max(root).key;
}
private Node max(Node x) {
if (x.right == null) {
return x;
} else {
return max(x.right);
}
}
public Key floor(Key key) {
Node x = floor(root, key);
if (x == null) {
return null;
} else {
return x.key;
}
}
private Node floor(Node x, Key key) {
if (x == null) {
return null;
}
int cmp = key.compareTo(x.key);
if (cmp == 0) {
return x;
}
if (cmp < 0) {
return floor(x.left, key);
}
Node t = floor(x.right, key);
if (t != null) {
return t;
} else {
return x;
}
}
public Key ceiling(Key key) {
Node x = ceiling(root, key);
if (x == null) {
return null;
} else {
return x.key;
}
}
private Node ceiling(Node x, Key key) {
if (x == null) {
return null;
}
int cmp = key.compareTo(x.key);
if (cmp == 0) {
return x;
}
if (cmp < 0) {
Node t = ceiling(x.left, key);
if (t != null) {
return t;
} else {
return x;
}
}
return ceiling(x.right, key);
}
这是我尝试非递归地执行此操作:
public Key min() {
if (isEmpty()) {
return null;
}
return min(root).key;
}
private Node min(Node x) {
while (x.left !=null){
x = x.left;
}
return x;
}
public Key max() {
if (isEmpty()) {
return null;
}
return max(root).key;
}
private Node max(Node x) {
while (x.right!=null){
x = x.right;
}
return x;
}
public Key floor(Key key) {
Node x = floor(root, key);
if (x == null) {
return null;
} else {
return x.key;
}
}
private Node floor(Node x, Key key) {
if (x == null) {
return null;
}
int cmp = key.compareTo(x.key);
if (cmp == 0) {
return x;
}
if (cmp < 0) {
while (x.left != null){
x = x.left;
if (x ==null){
return null;
}
}
}
Node t = x.right;
while (x.right != null){
x = x.right;
if (x == null){
return null;
}
}
if (t != null){
return t;
}
else{
return x;
}
}
我只是问我是否有正确的想法。
答案 0 :(得分:0)
是的,你有正确的想法。
private Node min(Node x) {
if (x.left == null) {
return x;
} else {
return min(x.left);
}
}
这是上述函数的良好非递归解决方案。
private Node min(Node x) {
while (x.left !=null){
x = x.left;
}
return x;
}
你应该看一下http://en.wikipedia.org/wiki/Dynamic_programming,特别是Memoization。
编辑:另请参阅类似的主题:Way to go from recursion to iteration