给定函数fun的功能是:用递归算法计算斐波那契数列中第n项的值。从第1项起,斐波那契数列为:1、1、2、3、5、8、13、21、……。程序文件名:115.c。 输入测试数据:6 程序运行结果:8 【要求】 1)将上述程序录入到文件115.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。 2)题中用“/******found******/”来提示在下一行有错。 3)改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的声明或编译预处理命令,但不能增加其他语句,也不能删去整条语句。 【含有错误的源程序】: #include <stdio.h> long fun(int m) { /******found******/ switch(m); { case 0: return 0; /******found******/ case 1; case 2 : return 1 ; } /******found******/ fun(m-1)+fun(m-2) ; } void main() { long fib; int n; scanf("%d",&n); printf("n = %d\n",n); fib=fun(n); printf("fib = %d\n",fib); }
时间: 2023-06-29 19:11:16 浏览: 355
修改后的程序如下:
```c
#include <stdio.h>
long fun(int m) {
if (m == 0) {
return 0;
} else if (m == 1 || m == 2) {
return 1;
} else {
return fun(m-1) + fun(m-2);
}
}
int main() {
long fib;
int n;
scanf("%d", &n);
printf("n = %d\n", n);
fib = fun(n);
printf("fib = %ld\n", fib);
return 0;
}
```
修改说明:
1. 将 switch 语句改为 if-else 语句,防止出现分号错误。
2. 在第一种情况下返回 0。
3. 在第二种情况下返回 1。
4. 在第三种情况下递归调用函数 fun(m-1) 和 fun(m-2)。
5. 修改了 printf 函数中输出 fib 的格式。
6. 在主函数中返回 0。
相关问题
下列给定程序中函数fun的功能是:用递归算法计算斐波拉契数列中第n项的值从第1项起,斐波拉契数列为:11、2、3、5、8、13、21、.....例如:若给n输入7,则该项的斐波拉契数值为13。
这是一个计算斐波那契数列的递归函数,可以通过输入一个正整数n来计算斐波那契数列中第n项的值。斐波那契数列的定义是:第一项和第二项都为1,从第三项开始,每一项都等于前两项之和。
以下是代码实现:
```c
#include <stdio.h>
int fun(int n) {
if (n == 1 || n == 2) {
return 1;
} else {
return fun(n - 1) + fun(n - 2);
}
}
int main() {
int n, result;
printf("请输入一个正整数n:");
scanf("%d", &n);
result = fun(n);
printf("斐波那契数列中第%d项的值为:%d\n", n, result);
return 0;
}
```
例如,当输入7时,输出结果为:
```
请输入一个正整数n:7
斐波那契数列中第7项的值为:13
```
完成斐波那契法和黄金分割法的MATLAB编程与调试; (2)使用斐波那契法和黄金分割法分别求解下述问题minf(x)=x^2-2x+1 ,初始区间为[-1,2],精度ε等于10^(-4)
斐波那契搜索法是一种优化的二分查找算法,而黄金分割法则是寻找最优点的一种数值方法。在MATLAB中,我们可以编写函数来实现这两种方法并求解给定的问题。
首先,我们需要创建一个函数`fib_search_min(f, a, b, epsilon)`来实现斐波那契搜索法。斐波那契搜索需要递归地计算两个子区间的长度,直到满足精度要求。以下是简化的斐波那契搜索示例:
```matlab
function [x, min_val] = fib_search_min(f, a, b, epsilon)
% 初始化斐波那契数列
f0 = 0; f1 = 1;
while abs(f1 - (a + b)) > epsilon * (b - a)
mid = a + (f1 * (b - a)) / (f0 + f1);
if f(mid) < 0
b = mid;
else
a = mid;
end
temp = f0;
f0 = f1;
f1 = temp;
end
x = a;
min_val = f(a);
end
```
对于黄金分割法(也称作割线搜索),我们可以编写一个类似`golden_section_min(f, a, b, epsilon)`的函数。黄金分割比例约为(1 + sqrt(5))/2,我们会在这个比例处评估函数值并更新搜索区间。这里是一个简化版的黄金分割搜索示例:
```matlab
function [x, min_val] = golden_section_min(f, a, b, epsilon)
phi = (1 + sqrt(5)) / 2; % 黄金分割比例
c = a + phi * (b - a); % 右侧切割点
while abs(b - a) > epsilon
if f(a) <= f(c)
b = c;
c = a + phi * (b - a);
else
a = c;
end
end
x = (a + b) / 2; % 最优解
min_val = f(x);
end
```
现在你可以使用这两个函数来解决minf(x)的问题:
```matlab
fun = @(x) x.^2 - 2*x + 1; % 定义目标函数
[~, min_val_fib] = fib_search_min(fun, -1, 2, 1e-4);
[~, min_val_golden] = golden_section_min(fun, -1, 2, 1e-4);
fprintf('Minimum value using Fibonacci search: %.4f\n', min_val_fib);
fprintf('Minimum value using Golden section search: %.4f\n', min_val_golden);
```
运行此代码后,你将得到在指定精度下的斐波那契搜索法和黄金分割法找到的最小值。
阅读全文