int count;
int main(){
count=0;
printf("%6d\t %6d\t %6d\t ",i+1,multiFib(i),count);
}
int multiFib(int x){
if (x<2){
return 1;
count++;
}}
在此代码中,count
始终给出0结果。我把它变成了一个全局变量,而不是再次在函数中定义它。如何增加该变量?
按顺序输出;那不是问题。它给出了结果:
1 1 0
-
2 1 0
-
3 2 0
所以,count
没有增加 - 但为什么呢?
答案 0 :(得分:4)
虽然不能保证评估顺序(参见其他多个答案),但还有另一个更基本的问题(实际上是其中两个):
int multiFib(int x)
{
if (x<2){
return 1;
count++;
}
}
count
。您的编译器应警告无法访问的代码。multiFib()
返回值。您展示的main()
片段引用了未定义的变量i
。我假设这是因为您从for (i = 0; i < 40; i++)
语句之前删除了printf()
循环。要修复“评估顺序”问题,您可能需要使用:
int count;
int main(void)
{
for (int i = 0; i < 40; i++)
{
count = 0;
int fib = multiFib(i);
printf("%3d %10d %10d\n", i+1, fib, count);
}
return(0);
}
这会评估每次调用该函数时对multiFib()
的调用次数。
对于multiFib()
函数本身,您可能需要:
int multiFib(int x)
{
count++;
if (x < 2)
return x;
else
return multiFib(x-1) + multiFib(x-2);
}
虽然这是斐波纳契数字令人震惊的缓慢执行,所以你不应该用它来作为你作业的答案(但它确实会产生'工作'功能)。
示例输出:
1 0 1
2 1 1
3 1 3
4 2 5
5 3 9
6 5 15
7 8 25
8 13 41
9 21 67
10 34 109
11 55 177
12 89 287
13 144 465
14 233 753
15 377 1219
16 610 1973
17 987 3193
18 1597 5167
19 2584 8361
20 4181 13529
21 6765 21891
22 10946 35421
23 17711 57313
24 28657 92735
25 46368 150049
26 75025 242785
27 121393 392835
28 196418 635621
29 317811 1028457
30 514229 1664079
31 832040 2692537
32 1346269 4356617
33 2178309 7049155
34 3524578 11405773
35 5702887 18454929
36 9227465 29860703
37 14930352 48315633
38 24157817 78176337
39 39088169 126491971
40 63245986 204668309
请注意,如果你超过40,你开始得到算术溢出。它也会非常(非常,非常)慢。
答案 1 :(得分:3)
此:
if (x<2){
return 1;
count++;
}
在增加计数之前从函数返回。所以它永远不会增加。
返回不只是设置返回的值。它实际上退出了该功能。
只需交换这两行的顺序即可。此外,您应该密切关注编译器警告。任何体面的编译器都会警告您count++;
行无法访问。
答案 2 :(得分:1)
printf("%6d\t %6d\t %6d\t ",i+1,multiFib(i),count);
在C中未指定函数参数评估的顺序。multiFib
可以在count
函数调用中printf
之前或之后进行评估。
答案 3 :(得分:1)
未指定函数参数的评估顺序。 在您的代码中,
printf("%6d\t %6d\t %6d\t ",i+1,multiFib(i),count);
打印printf
后可能会调用multiFib(i)
函数count
的参数。
试试这个,
printf("%6d\t",multiFib(i));
printf("%6d\t %6d\t ",i+1,count);
检查结果。
答案 4 :(得分:1)
正如在另一个答案中所说,问题是没有指定函数参数的评估顺序,所以在你的例子中:
printf("%6d\t %6d\t %6d\t ",i+1,multiFib(i),count);
在将count
传递给multiFib(i)
函数之前或之后,您无法确定是否会对printf()
进行评估。
请提供look here以获取有关C ++评估顺序或here for evaluation order in C的详细信息。
通过将printf
分成两个调用来强制执行评估顺序,您可能会觉得很有用:
printf("%6d\t",multiFib(i));
printf("%6d\t %6d\t ",i+1,count);
像Nishith Jain M R在他的回答中建议的那样。