【问题标题】:why this code to print nth number giving runtime error?为什么这个代码打印第n个数字给出运行时错误?
【发布时间】:2018-08-04 10:09:03
【问题描述】:

我们必须打印一个系列的第 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;
}

【问题讨论】:

  • find_nth_term() 函数的返回类型是int,但您似乎没有返回实际值。您的return 语句在else 语句中为空。
  • 另外,你的i 永远不会被初始化。
  • @Inrin 但是,当我运行代码时,这不会引发任何错误。
  • -Wall 编译你的代码,你的编译器会报错。你没有遇到段错误是纯粹的(坏)运气。

标签: c


【解决方案1】:

如果您的函数中的if 语句的计算结果为False,那么您就不是return。您已将函数的 return 类型设置为 int,但实际上您并没有 returning 任何东西。

将该行更改为:

return (a + b + c);

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

【讨论】:

    【解决方案2】:

    所以两件事:

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

    【讨论】:

    • 这只是一个递归的任务
    【解决方案3】:

    由于多种原因,您的代码不正确:

    • 不递归时不返回任何内容。
    • 你没有在递归表达式中计算出正确的值
    • 数组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,则需要进行一些小的调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 2017-03-06
      • 2020-02-03
      相关资源
      最近更新 更多