C 为什么这段代码要打印第n个给出运行时错误的数字?

C 为什么这段代码要打印第n个给出运行时错误的数字?,c,C,我们必须打印序列的第n项,其前三项为a、b、c,第n项是前三项的总和 #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> //Complete the following function. int find_nth_term(int n, int a, int b, int c) { //Write your code here.

我们必须打印序列的第n项,其前三项为
a、b、c
,第n项是前三项的总和

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
//Complete the following function.

int find_nth_term(int n, int a, int b, int c) {
    //Write your code here.
    int i, arr[n];
    arr[0] = a;
    arr[1] = b;
    arr[2] = c;
    if (n >= 3 && i <= n) {
       arr[i] = arr[i - 1] + arr[i - 2] + arr[i - 3];
       //using recursion to find nth term 
       return find_nth_term(n, a, b, c);
    } else {
        return;
    }
}

int main() {
    int n, a, b, c;

    scanf("%d %d %d %d", &n, &a, &b, &c);
    int ans = find_nth_term(n, a, b, c);

    printf("%d", ans); 
    return 0;
}
#包括
#包括
#包括
#包括
//完成以下功能。
整数查找项(整数n,整数a,整数b,整数c){
//在这里编写代码。
int i,arr[n];
arr[0]=a;
arr[1]=b;
arr[2]=c;

if(n>=3&&i如果函数中的
if
语句的计算结果为
False
,则您没有
返回任何内容。您已经将函数的
return
类型设置为
int
,但实际上没有
返回任何内容

将该行更改为:

return (a + b + c);
此外,正如@Inrin在评论中所指出的,您从不初始化
i

,因此有两件事:

事情1:您正在声明一个长度为N的数组,然后从0访问到N(即N+1变量),这将导致内存泄漏

事情2:当for循环如此简单时,为什么要递归地执行此操作:

for(i = 3; i<n; i++)
{
   arr[i]=arr[i-1]+arr[i-2]+arr[i-3];
}
return (arr[n-1]);

for(i=3;i由于多种原因,您的代码不正确:

  • 不递归时不返回任何内容
  • 您没有在递归表达式中计算正确的值
  • 数组
    arr
    应该只有3个元素,而不是
    n
  • 您不处理
    n
    以下
    3
  • 不需要递归,一个简单的迭代方法就足够了
以下是更正的递归版本:

#include <stdio.h>

int find_nth_term(int n, int a, int b, int c) {
    int arr[3];
    if (n < 3) {
       if (n < 0) {
           return 0;
       } else {
           arr[0] = a;
           arr[1] = b;
           arr[2] = c;
           return arr[n];
    } else {
       return find_nth_term(n - 1, b, c, a + b + c);
    }
}

int main(void) {
    int n, a, b, c, ans;

    if (scanf("%d %d %d %d", &n, &a, &b, &c) == 4) {
        ans = find_nth_term(n, a, b, c);
        printf("%d\n", ans);
    }
    return 0;
}
#包括
整数查找项(整数n,整数a,整数b,整数c){
int-arr[3];
if(n<3){
if(n<0){
返回0;
}否则{
arr[0]=a;
arr[1]=b;
arr[2]=c;
返回arr[n];
}否则{
返回第n项(n-1,b,c,a+b+c);
}
}
内部主(空){
int n,a,b,c,ans;
如果(扫描频率(“%d%d%d%d”、&n、&a、&b、&c)==4){
ans=找到第n项(n,a,b,c);
printf(“%d\n”,ans);
}
返回0;
}
以下是一种没有递归的替代方法:

int find_nth_term(int n, int a, int b, int c) {
    int arr[3];

    if (n < 0)
       return 0;

    arr[0] = a;
    arr[1] = b;
    arr[2] = c;
    while (n >= 3) {
        int v = arr[0] + arr[1] + arr[2];
        arr[0] = arr[1];
        arr[1] = arr[2];
        arr[2] = v;
    }
    return arr[n];
}
int查找n项(int n,int a,int b,int c){
int-arr[3];
if(n<0)
返回0;
arr[0]=a;
arr[1]=b;
arr[2]=c;
而(n>=3){
int v=arr[0]+arr[1]+arr[2];
arr[0]=arr[1];
arr[1]=arr[2];
arr[2]=v;
}
返回arr[n];
}

请注意,上面代码中的第n个术语是基于0的,这意味着
查找第n个术语(1,a,b,c)
返回
b
。如果希望它返回
a
,则需要进行一些小的调整。

查找第n个术语()的返回类型
函数是
int
,但您似乎没有返回实际值。您的
return
语句在
else
语句中为空。此外,您的
i
从未初始化。@Inrin但是,在我运行代码时,这不会引发任何错误。使用
-Wall
编译您的代码,编译器会抱怨.你没有得到一个SEGFULT纯粹是(坏)运气。这只是一个递归的任务