追光THO 发表于 2023-3-27 12:41:57

请问这个递归我写的代码哪里有问题?

https://www.dotcpp.com/oj/problem1004.html
这是题目网址
#include<stdio.h>
int fun(int n)
{
        if(n<=4)
                return n;
        else
                return fun(n-1)+fun(n-3);
}
int main()
{
        int n;
        while(n!=0)
        {scanf("%d",&n);
   printf("%d\n",fun(n));
        }
        return 0;
       
}
#include<stdio.h>
int main()
{
        int a,n,p={1,2,3,4};
        while(n!=0)
        {scanf("%d",&n);
        for(a=4;a<=54;a++)
                p=p+p;
        a = n-1;
        printf("%d\n",p);}
        return 0;
        }
两种思路提交上去都有问题。

isdkz 发表于 2023-3-27 12:45:53

你好!这里为你提供两个修正后的代码。

请注意在使用scanf输入n之前,要先将n初始化为一个非零值,以便在循环中不会立即终止。

第一种方法:递归

#include<stdio.h>

int fun(int n)
{
      if(n <= 4)
                return n;
      else
                return fun(n-1) + fun(n-3);
}

int main()
{
      int n = 1;
      while(n != 0)
      {
                scanf("%d", &n);
                if(n == 0)
                        break;
                printf("%d\n", fun(n));
      }
      return 0;
}


第二种方法:动态规划

#include<stdio.h>

int main()
{
      int a, n = 1, p = {1, 2, 3, 4};
      for(a = 4; a <= 54; a++)
                p = p + p;
      
      while(n != 0)
      {
                scanf("%d", &n);
                if(n == 0)
                        break;
                a = n - 1;
                printf("%d\n", p);
      }
      return 0;
}

追光THO 发表于 2023-3-27 13:41:37

isdkz 发表于 2023-3-27 12:45
你好!这里为你提供两个修正后的代码。

请注意在使用scanf输入n之前,要先将n初始化为一个非零值,以便 ...

你好,确实解决了,忘记变量初始化了,请问一般来说所有变量初始化都要赋值一个数吗?这里我存在问题是因为n在内存中随机,有可能出现n = 0的情况吗?

isdkz 发表于 2023-3-27 13:59:17

追光THO 发表于 2023-3-27 13:41
你好,确实解决了,忘记变量初始化了,请问一般来说所有变量初始化都要赋值一个数吗?这里我存在问题是因 ...

在C语言中,局部变量在没有初始化的情况下,其值是未定义的。这意味着它们可能包含任意值,这取决于内存中的当前状态。在你的代码中,由于n没有被初始化,它可能确实包含一个值为0的初始值。这会导致循环在一开始就被终止,因此程序不会按照预期执行。

为了确保程序的正确和可预测性,通常建议为局部变量提供一个初始值。这不仅有助于避免潜在的错误,而且可以使代码更具可读性。然而,在某些情况下,你可能会故意留出未初始化的局部变量,但这通常是在你明确知道在使用这个变量之前它将被赋予一个值的情况下。

所以,尽管不是强制性的,但为了编写健壮、可靠的代码,最好在使用局部变量之前对其进行初始化。

追光THO 发表于 2023-3-27 16:36:07

isdkz 发表于 2023-3-27 13:59
在C语言中,局部变量在没有初始化的情况下,其值是未定义的。这意味着它们可能包含任意值,这取决于内存 ...

好的,谢谢您的指导
页: [1]
查看完整版本: 请问这个递归我写的代码哪里有问题?