C 为什么这段代码要打印第n个给出运行时错误的数字?
我们必须打印序列的第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.
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纯粹是(坏)运气。这只是一个递归的任务