【问题标题】:Can someone help me understand this program?有人可以帮我理解这个程序吗?
【发布时间】:2018-07-05 08:32:41
【问题描述】:

这是我在C 中的程序。

f(int n){
    if(!n){
        return 0;
    }
    printf("%d", f(--n));
    printf("*");
    return (n+1);
}

int main()
{
    f(3);
    return 0;
}

它会打印:

0*1*2*

现在我不明白为什么它首先进入 printf 并进入 (--n) 但在达到 0 之前不打印任何内容

【问题讨论】:

  • 这不是递归的好例子,但对于理解递归来说是一个很好的(足够简单)。
  • 您为什么要使用 30 多年的过时风格编写 C?谁教你这样做的?
  • 我的教授给我们这个来理解递归的过程
  • @MarkoPrtenjača 我认为他们应该在 2018 年专注于教你如何编程 C,而不是在 1978 年如何编程。但这是我个人的意见......
  • @Lundin 是的,我知道他们有时在向我们展示这些类型的程序时真的很奇怪哈哈

标签: c recursion


【解决方案1】:

一张图片胜过千言万语。

  • 实心箭头 = 函数调用

  • 虚线箭头 = 函数返回。

【讨论】:

    【解决方案2】:

    使用此程序,您将拥有以下流程:

    f(3) -> call f(2)
    f(2) -> call f(1)
    f(1) -> call f(0)
    f(0) -> return 0
    
    f(1) -> print(0) print(*) and return 0+1
    f(2) -> print(1) print(*) and return 1+1
    f(3) -> print(2) print(*) and return 2+1
    
    main
    

    将打印 0*1*2*

    【讨论】:

      【解决方案3】:

      它在到达 0 之前不会打印任何内容,因为在 printf 中首先执行 f(--n) 以计算结果。这会导致函数递归地执行直到它达到 0。然后它返回上一级的值并开始打印您的结果0*1*2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-25
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-13
        相关资源
        最近更新 更多