为了理解贪婪方法和动态编程等高级算法概念,首先需要精通递归.
我对递归比较新.每当提出问题时,首先要记住的是使用迭代的解决方案.即使我知道递归方法的含义及其工作方式,但很难以递归方式进行思考.
请回答以下问题,以帮助解决问题:
1)任何迭代方法都可以用递归代替,反之亦然吗?
例如,如何以递归方式打印大小为n的数组中的元素?
for i 0 to n
Print a[i]
Run Code Online (Sandbox Code Playgroud)
2)如何递归地解决问题?步骤是什么?是否有任何提示可以确定问题可以递归解决?
例如:如果要求打印出字符串的所有子字符串
INPUT: CAT
OUTPUT: CAT,CA,A,AT,T
Run Code Online (Sandbox Code Playgroud)
我可以快速提出迭代方法.使用两个循环可以解决问题.
但递归地如何解决它.如何识别问题可以递归解决.
如果回答我的第一个问题是肯定的,使用两次递归而不是迭代可以解决我的问题?
3)任何人都可以建议我一些材料/资源来彻底理解递归的概念吗?
我正在阅读泛型,并尝试编写以下代码.没有编译错误.
import java.util.*;
public class JavaApplication14 {
public<T> void run (T obj ) {
//Do Something
}
public static void main(String[] args) {
JavaApplication14 m= new JavaApplication14();
m.run(new ArrayList<>());
m.run(new Interger(5);
m.run(5);
}
}
Run Code Online (Sandbox Code Playgroud)
如果功能是
public<T extends Number> void run (T obj) {
//Do Something
}
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为我们可以将此函数的参数限制为Number及其子类型.但非常混淆功能"运行"没有任何约束意味着什么?它现在可以将任何对象作为参数吗?在什么情况下我需要使用泛型这样的函数?
class A { ... }
class B extends A implements Comparable<A> {
int compareTo(A aobject) { ... }
}
Run Code Online (Sandbox Code Playgroud)
通常我们Comparable
使用类型参数实现B
.但是java允许使用超类.
有没有我真的需要做这样的事情?
SCJP 6学习指南引用:
在该
finalize()
方法中,您可以编写将对相关对象的引用传递回另一个对象的代码,从而有效地使对象无法进行垃圾回收.如果稍后在同一个对象上再次符合垃圾回收条件,垃圾收集器仍然可以处理该对象并将其删除.但是,垃圾收集器会记住,对于此对象,finalize()
已经运行,并且它不会finalize()
再次运行
它为什么这么设计?finalize()
即使第二次将对象标记为集合时,该方法的目的仍然保持良好.那为什么Java决定跳过调用finalize()
?
从维基百科页面:
“如果将所有有向边替换为无向边,则产生一个连通(无向)图,则称为有向图”
这个准确吗?
上面的图形是在所有有向边都替换为无向边的情况下连接的,但是B到D或D到B之间没有路径违反了弱类型属性。