【问题标题】:Recursive Fib style function into Iterative?递归Fib风格函数变成迭代?
【发布时间】:2011-11-30 10:05:18
【问题描述】:

我在 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;
}

总而言之,我必须想出一个迭代算法来完成这项工作。唯一的问题是我不知道如何进行。如果有任何建议可以引导我走向正确的方向,我将不胜感激。

【问题讨论】:

标签: java arrays recursion integer iteration


【解决方案1】:

有时,已知问题的递归解决方案的迭代解决方案并不像递归解决方案那样直接。实现迭代解决方案的最简单方法是使用 - Dynamic Programming 基本上你想要的是创建一个临时数组来保存所有子问题的解决方案。为此,请按照输入的大小创建一个动态分配的数组。例如,如果您的递归函数是 int foo(int a) 用 1..n 的解填充数组,其中 n 是原始问题的输入。 更改算法,而不是递归调用自身,它将检查子问题的解决方案是否已经存在于数组中,如果不存在,则将其填满。这样子问题就不会计算无数次,而只会计算一次。

【讨论】:

    猜你喜欢
    • 2019-03-01
    • 2018-10-16
    • 1970-01-01
    • 2019-04-03
    • 2016-03-01
    • 2021-12-31
    • 2018-09-03
    • 2012-07-12
    • 2012-10-17
    相关资源
    最近更新 更多