我们必须打印系列的第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;
}
答案 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
,则需要一些小的调整。