摘要: 本文是对JVM使用方法区信息的一个归纳,并以一个例子作为说明进行讲解,希望有兴趣的朋友进来讨论。
阅读全文
int[] a = new int[N+1];
int i,k;
for(i=1;i<=n;i++)
a[i] = left[i];
k = n;
while(k>=1)
{
执行循环体内该做的事
while (a[k] + step[k]>right[k])
{
a[k] = left[k] ;
k--;
}
if(k==0)break;//此处也可以为continue;
a[k] = a[k] + step[k];
k = n;
}
}
p = malloc(n * sizeof(int));
for (i = 0; i < n; i++)
p[i] = i;
output(p, n);
for (i = n - 1; i > 0; i--)
if (p[i] > p[i - 1])
{
for (j = n - 1; p[j] < p[i - 1]; j--);
swap(&(p[i - 1]), &(p[j]));
for (j = i, k = n - 1; j < k; j++, k--)
swap(&(p[j]), &(p[k]));
ouput(p, n);
i = n;
}
free(p);
关于值传递和引用传递的问题,我想很多人刚开始学的时候都会很迷惑,特别是有些书的文学水平实在不敢恭维。
在此,我特在此对Java的传值和传址提出我自己的一个看法,也许让你能对这个问题的理解起到帮助。
首先:值传递是很好理解的。比如:
public class test {
int a = 3;
public void plus(int b){
b = b+1;
}
public static void main(String args[])
{
test t = new test();
t.plus(t.a);
System.out.println(t.a);
}
}
输出的结果是3.这就是值传递。其实我们可以这样理解:
在plus(int b)函数里,int b是作为这个函数的一个局部变量,在调用这个函数的时候开始位这个变量的内存空间。当我把变量a传给这个函数的时候,实际上是把a变量当时的值拷贝一个放到变量b的分配空间里,b = b+1;这句改变的只是函数的局部变量b的值,当调用结束的时候,变量b的作用范围也就结束了,而你在什么时候修改了变量a的分配空间呢?当然是没有啦(除非你理解成变量a的空间整个放进b的空间里:))
而所谓的引用传递,我觉得这个名次起的很混淆视听。以我自己的理解,一切传递都是拷贝传递。因为对象的标识符代表的是对象的存储地址,所以你把对象的标识符号传递给函数的时候,实际上是把对象地址的拷贝传递给了函数。虽然也是拷贝,但是2个地址拷贝都是指向一个地址的,所以如果在函数里修改了对象,那么也实际上就修改了原先的值.
归根到底一句话:Java一切参数的传递都是拷贝传递!
首先,请注意无后效性一般是针对问题的分析方式的,不是描述一个问题的。
我们说某问题不具有无后效性往往是指他的通常解法不具有这种性质,而如果我们把状态定义成满足无后效性原理
的方式,状态太多,也没有意义。
无后效性,就是说当前状态是历史的完全总结,和如何达到这一个状态无关。
例如,对于这道单词接龙的题目,每个单词最多用两次。
那么“当前接到的单词”就不能概括整个“历史”,因为同样是接到的这个单词,以前考虑过的单词究竟是用过
没有,用过多少次,将同样影响今后的发展,而单一的状态参量无法概括这些信息。如果把这些信息加到状态
参量中,状态太多(指数级),动态规划也没有多大意义。
如果影响历史的信息并不多,我们可以通过升维的方法让我们的状态具有无后效性,
所以我们在思考状态的时候,指导思想就是“简洁而又完全的概括历史”
摘要: 一篇关于ACM的文章,有时间的朋友可以进来看看
阅读全文