带功能的C开关盒

带功能的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);

有人能给我解释一下这个密码吗? 我不明白为什么这个代码中的打印值是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);
    }
}


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语句的工作原理如下:

  • 如果
    i
    为0,则返回0
  • 如果
    i
    为1或2,则返回1
  • 否则,返回
    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情况下,您需要一个语句断路器,如breakreturn,以便只有特定情况才能正确执行。因为在你的代码
案例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