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