鱼C论坛

 找回密码
 立即注册
查看: 1421|回复: 4

[已解决]请问这个递归我写的代码哪里有问题?

[复制链接]
发表于 2023-3-27 12:41:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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[55]={1,2,3,4};
        while(n!=0)
        {scanf("%d",&n);
        for(a=4;a<=54;a++)
                p[a]=p[a-1]+p[a-3];
        a = n-1; 
        printf("%d\n",p[a]);}
        return 0;
        }
两种思路提交上去都有问题。
最佳答案
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[55] = {1, 2, 3, 4};
        for(a = 4; a <= 54; a++)
                p[a] = p[a-1] + p[a-3];
        
        while(n != 0)
        {
                scanf("%d", &n);
                if(n == 0)
                        break;
                a = n - 1;
                printf("%d\n", p[a]);
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[55] = {1, 2, 3, 4};
        for(a = 4; a <= 54; a++)
                p[a] = p[a-1] + p[a-3];
        
        while(n != 0)
        {
                scanf("%d", &n);
                if(n == 0)
                        break;
                a = n - 1;
                printf("%d\n", p[a]);
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-27 13:41:37 | 显示全部楼层
isdkz 发表于 2023-3-27 12:45
你好!这里为你提供两个修正后的代码。

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

你好,确实解决了,忘记变量初始化了,请问一般来说所有变量初始化都要赋值一个数吗?这里我存在问题是因为n在内存中随机,有可能出现n = 0的情况吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

所以,尽管不是强制性的,但为了编写健壮、可靠的代码,最好在使用局部变量之前对其进行初始化。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的,谢谢您的指导
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-26 14:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表