【问题标题】:C switch case with functionC 带功能开关盒
【发布时间】:2017-06-07 21:49:33
【问题描述】:

谁能解释一下这段代码? 我不明白为什么这段代码中的打印值为 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));

}

【问题讨论】:

  • 想想printf("%d", f(3));是什么,然后想想printf("%d", f(4));...这是一个很好的练习来逐步了解自己。
  • 用铅笔和纸玩电脑。跟踪每一步和局部函数值。

标签: c function switch-statement


【解决方案1】:

也许您只需要在调试运行中单步执行代码,但这就是为什么您有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

【讨论】:

    【解决方案2】:

    这是实现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。

    【讨论】:

      【解决方案3】:

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

      switch 语句的工作原理如下:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-12
          • 1970-01-01
          相关资源
          最近更新 更多