1.引论

2022-07-18

1.引论

递归(recursive)

四个基本法则如下

  • 基准情形(base case) 必须总要有某些基准的情形,它们不用递归就能求解
  • 不断推进(making progress) 对于那些要递归求解的情形,递归调用必须总能够朝着一个基准情形推进。
  • 设计法则(design rule) 假设所有的递归调用都能运行

当设计递归程序时一般没有必要知道细节,不必去追踪大量的递归调用。从整体上去考虑就可以。

  • 合成效益法则(compound interest rule) 在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作。

取余运算是非常耗时的,因为n%10 = n-[n/10]*10

类似的 n%m = n-[n/m]*m

[x]是小于或等于x的最大整数

泛型

协变性 即是否能用is a来描述,如果可以,则具有协变性

java中数组是协变的,所以Teacher [] is-a person[]

集合也是协变的,但是泛型集合不是协变的。使用泛型的意义就在于产生编译器错误而不是运行时的类型不匹配异常

因此Collection 不能够传入参数为Collection的方法中

java中用通配符(wildcard)来解决泛型集合协变性的问题

	public static void test(Collection<? extends Person> arr){}

这样Teacher和Person都可以作为参数传进去

类型限界

	public static <AnyType extends Comparable<? super AnyType>> void test(AnyType [] arr){}

AnyType is-a Comparable T是AnyType 的父类,我们并不需要知道T具体是什么类型。
如果Person实现了Comparable接口。那么Teacher is-a Comparable,但Teacher is-not-a Comparable