【问题标题】:C program - RecursionC 程序 - 递归
【发布时间】:2021-03-22 11:28:20
【问题描述】:

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

    #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);
}

【问题讨论】:

  • 看答案,我建议养成使用一致缩进的习惯。实际上你做了非常严格的缩进,即使有问题的行也在与答案匹配的缩进处。但是您没有对缩进深度和与最近的} 的错误关系之间的明显冲突做出反应。有一个根深蒂固的习惯,这会让你很明显。

标签: arrays c function recursion combinations


【解决方案1】:

您得到的结果毫无意义,因为您的 printf 语句不在 else if 块中。 因此,当if (start &lt; 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));
}

【讨论】:

  • 谢谢,我把唯一值的个数存到ans变量里然后我把具体值存到字段里?我理解正确吗?
  • 如果我还有一个问题?是否可以防止重复值的重复计数?
  • @Aaron7 所以在这里,我将可能的值的数量存储在 ans 变量中。为了避免重复,我使用了 table[][] 数组。表数组一开始是 0,对于每个值,我将其设置为 1。(您也可以为这项工作使用哈希数据结构。阅读它:))稍后,我通过检查该值是否为 1 来避免重复
  • 请问如何才能知道玩家A的最高值是在哪个递归调用中得到的?对于第一次递归调用。玩家要达到最高分必须采取的第一步是什么?
  • 您可以使用全局变量来跟踪目前获得的最高分数,并在达到递归结束时添加一个 if 条件。并跟踪第一次移动,向函数添加更多参数以跟踪第一次移动..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
相关资源
最近更新 更多