Java ArrayList性能 公共静态ArrayList强制转换(双角度、双步骤、ArrayList列表){ 双x=px+Math.sin(角度/180*Math.PI)*步长; 双z=pz+Math.cos(角度/180*Math.PI)*步长; 如果((int)xmapWidth-1 | |(int)zmapHeight-1){ 退货清单; }否则{ 步骤+=质量; 添加(getHeight(x,z)); 返回铸件(角度、台阶、列表); } }

Java ArrayList性能 公共静态ArrayList强制转换(双角度、双步骤、ArrayList列表){ 双x=px+Math.sin(角度/180*Math.PI)*步长; 双z=pz+Math.cos(角度/180*Math.PI)*步长; 如果((int)xmapWidth-1 | |(int)zmapHeight-1){ 退货清单; }否则{ 步骤+=质量; 添加(getHeight(x,z)); 返回铸件(角度、台阶、列表); } },java,android,Java,Android,我正在制作一个光线投射器,此函数返回高度(方向、距离)。由于我需要投下几乎视场/屏幕宽度的时间,这对我的应用程序来说是非常昂贵的。如何使用递归函数使动态数组更快?递归函数效率不高,尽管它们可以轻松地解决难题 当您需要提高递归函数的性能时,迭代实现递归函数(如果可能的话)可能会获得最佳结果 希望这段代码对您有所帮助 公共静态列表转换(双角度、双台阶、列表){ while(true){ 双x=px+Math.sin(角度/180*Math.PI)*步长; 双z=pz+Math.cos(角度/180*

我正在制作一个光线投射器,此函数返回高度(方向、距离)。由于我需要投下几乎视场/屏幕宽度的时间,这对我的应用程序来说是非常昂贵的。如何使用递归函数使动态数组更快?

递归函数效率不高,尽管它们可以轻松地解决难题

当您需要提高递归函数的性能时,迭代实现递归函数(如果可能的话)可能会获得最佳结果

希望这段代码对您有所帮助

公共静态列表转换(双角度、双台阶、列表){
while(true){
双x=px+Math.sin(角度/180*Math.PI)*步长;
双z=pz+Math.cos(角度/180*Math.PI)*步长;
如果((int)x<0 | |(int)x>mapWidth-1 | |(int)z<0 | |(int)z>mapHeight-1){
打破
}
添加(getHeight(x,z));
步骤+=质量;
}
退货清单;
}

递归函数效率不高,尽管它们可以轻松解决难题

当您需要提高递归函数的性能时,迭代实现递归函数(如果可能的话)可能会获得最佳结果

希望这段代码对您有所帮助

公共静态列表转换(双角度、双台阶、列表){
while(true){
双x=px+Math.sin(角度/180*Math.PI)*步长;
双z=pz+Math.cos(角度/180*Math.PI)*步长;
如果((int)x<0 | |(int)x>mapWidth-1 | |(int)z<0 | |(int)z>mapHeight-1){
打破
}
添加(getHeight(x,z));
步骤+=质量;
}
退货清单;
}

如果在递归之前无法估计数组大小的上限
M
,则
LinkedList
将为
ArrayList
提供O(1)追加与摊销O(1)。但是,对于链表,访问列表中的随机元素时将不会使用O(1)。如果您可以提供这样一个估计值
M
,只需将它作为
initialCapacity
传递给
ArrayList
@AlexandreDupriez的构造函数,我现在使用它作为迭代器,以获得列表的所有高度。使用初始容量初始化ArrayList将返回奇数大小,这将导致奇怪的输出。如果在递归之前无法估计数组大小的上限
M
,则
LinkedList
将为
ArrayList
提供O(1)追加与摊销O(1)。但是,对于链表,访问列表中的随机元素时将不会使用O(1)。如果您可以提供这样一个估计值
M
,只需将它作为
initialCapacity
传递给
ArrayList
@AlexandreDupriez的构造函数,我现在使用它作为迭代器,以获得列表的所有高度。使用初始容量初始化ArrayList将返回奇数大小,这将导致奇怪的输出。您编写的“List”是否表示ArrayList?List正是ArrayList实现的接口。由于在该方法中,您不使用任何特定于ArrayList的方法,而只使用集合界面中定义的
add
,因此在运行时将参数定义为ArrayList、List或Collection没有区别。针对具体类使用接口所得到的是灵活性。如果有一天你决定列表将是一个LinkedList,你不需要改变你传递变量的每个方法。你写的“list”是指ArrayList吗?list就是ArrayList实现的接口。由于在该方法中,您不使用任何特定于ArrayList的方法,而只使用集合界面中定义的
add
,因此在运行时将参数定义为ArrayList、List或Collection没有区别。针对具体类使用接口所得到的是灵活性。若有一天你们决定这个列表将是一个LinkedList,你们不需要改变传递那个变量的每个方法。
public static ArrayList<Double> Cast(double angle,double step,ArrayList<Double> list){
    double x = px + Math.sin(angle/180*Math.PI)*step;
    double z = pz + Math.cos(angle/180*Math.PI)*step;

    if((int)x<0||(int)x>mapWidth-1||(int)z<0||(int)z>mapHeight-1){
        return list;
    }else{
        step+=quality;
        list.add(getHeight(x,z));
        return Cast(angle,step,list);
    } 
}