0

我为我的作业编写了一个递归函数来进行以下计算:

对于输入:
1 2 3 4

它应该这样做:
((1*3)+2) + ((1*4)+3) = 13, 小于, ((2*4)+3) + ((1*4)+2) = 17, 所以它返回 13。用字母它应该做这个计算:((A*C)+B) + ((A*D)+C)并将它与其他选项进行比较, 在这种情况下有 2 个选项: ((B*D)+C) + ((A*D)+C)

几句话。数字表示段每一端的“螺钉”数量。该段始终由 2 个数字组成。分段 A {1 2}、B {2 3}、C {3 4}。

任务是加入所有 N 个段。我必须找到“最便宜”的方法来做到这一点。每次我加入两个部分(例如 A 和 B)时,我都会这样做:

A 的“底部螺钉”(1 - 第一个数字)* B 的“顶部螺钉”(3 - 第三个数字)+“连接螺钉”(2 - 之间的数字)。

我必须按顺序加入它们,它总是必须以 ABCD 顺序结束。但我可以选择从哪里开始。我可以加入 A 到 B,然后 AB 到 C,或者我可以加入 B 到 C,然后 A 到 BC。基本上在其中一种情况下,“成本”将是最低的,这就是要返回的价值。

现在我已经这样做了,但我很困惑:

*help是一个相互计算数组,我用它来存储递归中得到的新值。

int *help;

*mezi是一个动态分配的数组,定义为:

int *mezi;

里面看起来像{0,4,1,2,3,4,-1}

mezi[0] = here is stored the total prize in the recursion.

mezi[1] = here is stored the number of values in the array, 4 for 4 values (3 segments).

mezi[n+2] = the last number (-1), its just an identifier to find out the number of values.

这是我的代码:

int findmin(int *mezi, int *pomocny)
{
    int i,j,k;
    int prize, prizemin, mini, minih;

    for (i=3;i<mezi[1];i++) {

        prize = mezi[i-1] * mezi[i+1] + mezi[i];
        if (i==3) { mini = i; minih = prize; }

        if (prize < minih) { mini = i; minih = prize; }

        if (mezi[1] > 3){

            k=2;
            for (j=2;j<mezi[1];j++) {
                if (j != mini) help[k] = mezi[j];
                k++;
            }
            help[1] = (mezi[1]-1);
        }
        help[0] += prize;

        findmin(help,help);
    }
    prizemin = help[0];

    return prizemin;
}

我是个新手,不久前我开始使用 C,递归函数让我很困惑。我会感谢您的帮助。谢谢 :)

4

1 回答 1

0

您的程序逻辑存在很多问题。

int findmin(int *mezi, int *pomocny)
{
    int i,j,k;
    int prize, prizemin, mini, minih;

    for (i=3;i<mezi[1];i++) 
    {
        prize = mezi[i-1] * mezi[i+1] + mezi[i];
        if (i==3) { mini = i; minih = prize; } //This is a redundant test and 
        //initialization. i == 3 is true only in the first run of the loop. These
        //initialization should be done in the loop itself

        if (prize < minih) { mini = i; minih = prize; }

        if (mezi[1] > 3){  //This is also redundant as mezi[3] is always greater than 3 
        // otherwise the loop wont run as you check for this in your test expression

            k=2;
            for (j=2;j<mezi[1];j++) {
                if (j != mini) help[k] = mezi[j];
                k++;
            }
            help[1] = (mezi[1]-1);
        }
        help[0] += prize;

        //The only base case test you have is mezi[1]<3 which you should make sure is 
        // present in your data set

        findmin(help,help);
    }
    prizemin = help[0];

    return prizemin;
}
于 2012-12-01T06:45:40.250 回答