C 程序 - 递归

C program - Recursion

我有一个程序,其中字段有数字,玩家逐渐从右边或左边移除两个元素或一个元素,玩家轮流。我想计算所有组合(玩家总和)。为什么我有时会在这里得到无意义的结果?

    #include <stdio.h>

int rekurze(int *mince, int start, int last, int playerA, int playerB, int player)
{   
    if (start < last)
    {
        if (player)
        {
            if(last-start == 1)
            {
                rekurze(mince, start+1, last, playerA, playerB+mince[start], 1);
                rekurze(mince, start, last-1, playerA, playerB+mince[last], 1);
            }
            rekurze(mince, start+2, last, playerA+mince[start]+mince[start+1], playerB, 0);
            rekurze(mince, start+1, last, playerA+mince[start], playerB, 0);
            rekurze(mince, start+1, last-1, playerA+mince[start]+mince[last], playerB, 0);
            rekurze(mince, start, last-1, playerA+mince[last], playerB, 0);
            rekurze(mince, start, last-2, playerA+mince[last]+mince[last-1], playerB, 0);
        }
        else
        {
            if(last-start == 1)
            {
                rekurze(mince, start+1, last, playerA, playerB+mince[start], 1);
                rekurze(mince, start, last-1, playerA, playerB+mince[last], 1);
            }
            rekurze(mince, start+2, last, playerA, playerB+mince[start]+mince[start+1], 1);
            rekurze(mince, start+1, last, playerA, playerB+mince[start], 1);
            rekurze(mince, start+1, last-1, playerA, playerB+mince[start]+mince[last], 1);
            rekurze(mince, start, last-1, playerA, playerB+mince[last], 1);
            rekurze(mince, start, last-2, playerA, playerB+mince[last]+mince[last-1], 1);
        }
    }
    else if(start==last)
    {
        if(player)
            playerA += mince[start];
        else
            playerB += mince[start];
    }
            printf("Skore A: %d, ", playerA);
            printf("Skore B: %d\n", playerB);
}   

int main (void)
{
    int mince[] = {3,5,3};
    int konec = (sizeof(mince)/sizeof(int))-1;
    int start = 0;

    rekurze (mince, start, konec, 0, 0, 1);
}

您得到的结果毫无意义,因为您的 printf 语句不在 else if 块中。 因此,当 if (start < last)else if(start==last) 为假时,您仍在打印对您的情况无效的值。 如果你想计算可能的独特组合,你可以看看下面编辑过的代码。

#include <stdio.h>
int table[100][100]={0};
int rekurze(int *mince, int start, int last, int playerA, int playerB, int player)
{   
    int ans=0;
    if (start < last)
    {
        if (player)
        {
            if(last-start == 1)
            {
                ans+=rekurze(mince, start+1, last, playerA, playerB+mince[start], 1);
                ans+=rekurze(mince, start, last-1, playerA, playerB+mince[last], 1);
            }
            ans+=rekurze(mince, start+2, last, playerA+mince[start]+mince[start+1], playerB, 0);
            ans+=rekurze(mince, start+1, last, playerA+mince[start], playerB, 0);
            ans+=rekurze(mince, start+1, last-1, playerA+mince[start]+mince[last], playerB, 0);
            ans+=rekurze(mince, start, last-1, playerA+mince[last], playerB, 0);
            ans+=rekurze(mince, start, last-2, playerA+mince[last]+mince[last-1], playerB, 0);
        }
        else
        {
            if(last-start == 1)
            {
                ans+=rekurze(mince, start+1, last, playerA, playerB+mince[start], 1);
                ans+=rekurze(mince, start, last-1, playerA, playerB+mince[last], 1);
            }
            ans+=rekurze(mince, start+2, last, playerA, playerB+mince[start]+mince[start+1], 1);
            ans+=rekurze(mince, start+1, last, playerA, playerB+mince[start], 1);
            ans+=rekurze(mince, start+1, last-1, playerA, playerB+mince[start]+mince[last], 1);
            ans+=rekurze(mince, start, last-1, playerA, playerB+mince[last], 1);
            ans+=rekurze(mince, start, last-2, playerA, playerB+mince[last]+mince[last-1], 1);
        }
        return ans;
    }
    else if(start==last)
    {
        if(player)
            playerA += mince[start];
        else
            playerB += mince[start];
        printf("Skore A: %d, ", playerA);
        printf("Skore B: %d\n\n", playerB);
        if(table[playerA][playerB] == 0)
        {
            table[playerA][playerB] = 1;
            return 1;
        }
        return 0;    
            
    }
    return 0;            
}   

int main (void)
{
    int mince[] = {3,5,3};
    int konec = (sizeof(mince)/sizeof(int))-1;
    int start = 0;

    printf("\nUnique results: %d\n",rekurze (mince, start, konec, 0, 0, 1));
}