我在java中有一个函数,它使用递归算法编写,需要以迭代形式编写。问题是我不知道从哪里开始围绕一个新的算法围绕这个。这是我正在进行的任务。
考虑以下计算问题:
假设您是一名顾问,并且您有一系列n
潜在的咨询工作,分别支付A[0],A[1],..,A[n-1]
美元(因此工作0
支付A[0]
美元,工作1
支付A[1]
美元等。)
此外,作业i
从i
(i = 0 ; : : : ; n 1 )
开始。
但是,每项工作需要2天,因此您无法执行任何两个连续的工作。目标是确定最大金额,用F(n)
表示;您可以从n
个工作A[0]
到A[n-1]
中选择的有效工作时间表中获得收入
:
例如,请考虑以下输入数组:
0 1 2 3 4 5
A 5 6 8 6 2 4
最佳时间表是做0 ; 2 ;
和5
个工作;其中的金额
赚了,F(6) = A[0] + A [2] + A [5] = 17
;尽可能大。请注意这一点
是一个有效的时间表,因为不包括两个连续的工作。
我解决此问题的递归版本函数如下:
public static int jobScheduleRecursive(int[] A, int n)
{
n = A.length;
if(n == 0){return 0;}
else if(n == 1){return A[0];}
else if(n >= 2){return max(jobScheduleRecursive(A, (n-1)), (A[n-1])
+ jobScheduleRecursive(A, n-2));}
else return -1;
}
总而言之,我必须提出一种能够完成这项工作的迭代算法。唯一的问题是我不知道如何继续。如果有任何建议可以引导我朝着正确的方向前进,我将不胜感激。
答案 0 :(得分:1)
有时,针对问题的已知递归解决方案的迭代解决方案不是直接作为递归解决方案。实现迭代解决方案的最简单方法是使用 - Dynamic Programming基本上你想要的是创建一个临时数组,该数组保存所有子问题的解决方案。要实现这一点,请在输入大小中创建动态分配的数组。如果你的递归函数是int foo(int a) 使用1..n的解决方案填充数组,其中n是原始问题的输入。 改变算法,它不是递归地调用自己,而是检查子问题的解决方案是否已经存在于数组中,如果没有,则填充它。这样一个子问题不会计算数字时间,而只会计算一次。