具有功能

时间:2017-06-07 21:49:33

标签: 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);
    }
}


void main(void) {

printf("%d", f(6));

}

4 个答案:

答案 0 :(得分:6)

也许您只需要在调试运行中单步执行代码,但这就是您f(6)=8

的原因
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

答案 1 :(得分:3)

这是实现Fibonacci sequence

的递归函数

让我们考虑一个更简单的场景(为了缩短响应长度),如果我们调用参数为4的函数: f(4)

通过它我们发现:

  • 名为f(4)
  • 点击默认case语句调用f(2)+ f(3)
    • f(2)调用将命中2的case语句并返回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.

答案 2 :(得分:1)

这是Fibonacci sequence的递归实现,其中每个数字是前面两个数字的总和。

switch语句的工作原理如下:

  • 如果i为0,则返回0
  • 如果i为1或2,则返回1
  • 否则,返回f(i-2)f(i-1)的总和 - 这最终归结为上述两个基本情况。

答案 3 :(得分:1)

这是一个递归函数,包含一个switch case。通常,在Switch案例中,您需要一个语句断开器,如中断返回,以便只有特定情况才能正确执行。由于代码中case 1case 2返回相同的值,即1代码分解为8 1的总和,最终总和为8。