为什么用此代码打印第n个数字却给出运行时错误?

时间:2018-08-04 10:09:04

标签: 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.
    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;
}

3 个答案:

答案 0 :(得分:1)

如果函数中的return语句的值为if,则您不会False进行任何操作。您已将函数的return类型设置为int,但实际上并没有return进行任何操作。

将该行更改为:

return (a + b + c);

此外,正如@Inrin在评论中指出的那样,您永远不会初始化i

答案 1 :(得分:0)

有两件事:

事情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]);

答案 2 :(得分:0)

您的代码不正确有多种原因:

  • 不递归时您不返回任何内容。
  • 您没有在递归表达式中计算正确的值
  • 数组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;
}

这是一种无需递归的替代方法:

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];
}

请注意,以上代码中的第 n 项基于0,这意味着find_nth_term(1, a, b, c)返回b。如果您希望它返回a,则需要一些小的调整。