C 程序 - 递归

Posted

技术标签:

【中文标题】C 程序 - 递归【英文标题】:C program - Recursion 【发布时间】: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);

【问题讨论】:

看答案,我建议养成使用一致缩进的习惯。实际上你做了非常严格的缩进,即使有问题的行也在与答案匹配的缩进处。但是您没有对缩进深度和与最近的 的错误关系之间的明显冲突做出反应。有一个根深蒂固的习惯,这会让你很明显。 【参考方案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 条件。并跟踪第一次移动,向函数添加更多参数以跟踪第一次移动..

以上是关于C 程序 - 递归的主要内容,如果未能解决你的问题,请参考以下文章

C 程序 - 递归

c递归程序

用 C 语言编写一个程序,该程序使用递归来确定一个数字是不是为素数。大量出现堆栈溢出错误

递归下降分析程序报告

C语言的两个问题: 所有的递归程序均可以用非递归算法实现?递归函数中的形式参数是自动变量吗? c语言中

C语言 编写递归函数