带功能的C开关盒
有人能给我解释一下这个密码吗? 我不明白为什么这个代码中的打印值是8 有人能给我解释一下吗带功能的C开关盒,c,function,switch-statement,C,Function,Switch Statement,有人能给我解释一下这个密码吗? 我不明白为什么这个代码中的打印值是8 有人能给我解释一下吗 #include <stdio.h> int f(int i){ switch (i){ case 0 : return 0; case 1: case 2: return 1; default: return f(i-2)+f(i-1);
#include <stdio.h>
int f(int i){
switch (i){
case 0 :
return 0;
case 1:
case 2:
return 1;
default:
return f(i-2)+f(i-1);
}
}
void main(void) {
printf("%d", f(6));
}
#包括
int f(int i){
开关(一){
案例0:
返回0;
案例1:
案例2:
返回1;
违约:
返回f(i-2)+f(i-1);
}
}
真空总管(真空){
printf(“%d”,f(6));
}
这是一个递归实现,其中每个数字是前面两个数字的总和
switch语句的工作原理如下:
- 如果
为0,则返回0i
- 如果
为1或2,则返回1i
- 否则,返回
和f(i-2)
-这最终归结为上述两种基本情况f(i-1)
让我们考虑一个更简单的场景(以缩短响应长度),如果我们调用函数为4的函数:<强> f(4)< /强>
通过它,我们发现:- 称为f(4)
- 点击defaultcase语句调用f(2)+f(3)
- f(2)调用将命中case语句2并返回1
- f(3)调用将命中默认case语句并调用f(1)+f(2)
- f(1)和f(2)都将命中各自的case语句并返回1
- 现在我们知道f(3)调用返回f(1)+f(2)=1+1=2
- 现在我们知道f(4)调用返回f(2)+f(3)=1+2=3
我建议使用相同的过程来了解调用f(5)返回5的原因。然后利用f(4)=3和f(5)=5这一事实,你可以理解为什么f(6)=f(4)+f(5)=8。也许你只需要在调试运行中逐步完成代码,但这就是为什么你有
f(6)=8
这是一个递归函数,其中包含一个开关案例。通常,在Switch情况下,您需要一个语句断路器,如break或return,以便只有特定情况才能正确执行。因为在你的代码
案例1
和案例2
返回到相同的值,即1,你的代码分解为8个1的和,最终的和是8。考虑什么是printf(“%d”,f(3))代码>,然后考虑<代码> PrimTf(“%d”,f(4));<代码>。。。这是一个很好的锻炼自己的方法。用铅笔和纸玩电脑。跟踪每个步骤和本地函数值。
step1: f(6)
step2: f(6-2) +f(6-1)
step3: f(4-2)+f(4-1) +f(5-2) +f(5-1)
step4: f(2) +f(3-2)+f(3-1)+f(3-2)+f(3-1)+f(4-2)+f(4-1)
step5: 1 +1 +1 +1 +1 +1 +f(3-2)+f(3-1)
step6: 1 +1 +1 +1 +1 +1 +1 +1
final: 8