【问题标题】:Please, can you help me with this recursive function?拜托,你能帮我解决这个递归函数吗?
【发布时间】:2014-11-09 17:38:24
【问题描述】:
#include <stdio.h> 
int  fun (int x)
 {
      if (x<1)
        return(1);
      else
        printf("%d %d \n", x, fun(x-1));
 }
int main()
 { int x,y;
   x = 5;
   y = fun(x);
   printf("\n x = %d f(x) = %d \n", x, y);
   return 0;
  }

这个程序包含一个计算一些数字的递归函数。输出中有一些我无法理解的内容。 以下链接有输出截图:

https://onedrive.live.com/redir?resid=BE4862D617298D2C!886&authkey=!AA03bF8dQ5W4S9Y&v=3&ithint=photo%2cpng

为什么右栏(红色圆圈)如图所示?我以为这个专栏会全是一,而不是那个。

【问题讨论】:

    标签: c recursion


    【解决方案1】:

    因为函数fun在x >= 1时没有返回值。

    而5是printf("%d %d \n", x, fun(x-1));的返回值,因为它输出了5个字符。

    【讨论】:

    • 纯属巧合,是未定义的行为。
    • @2501 未定义但并非巧合。
    • @2501 哦,是的。我刚才注意到它恰好输出了5个字符,而printf的返回值为5……也许它们之间有什么关系?其实我也不是很清楚……
    • @hvd 这就是巧合的定义。
    • @2501 不,不是。未定义行为的结果是编译器生成机器代码,导致printf 的返回值被传递给调用者。巧合是完全独立计算的相同返回值。
    【解决方案2】:

    如果x&gt;=1,则不会返回任何内容,当执行到达函数末尾时会导致未定义的行为。这意味着值可以是任何值,你得到 5 是偶然的。

    6.9.1。 p12:

    如果到达终止函数的},并且函数调用的值被 调用者,行为未定义。

    您的示例中使用了返回值。

    int fun(int x)
    {
        if (x<1)
            return(1);
        else
            printf("%d %d \n", x, fun(x-1));
    
        return x ;//just return something
    }
    

    您可能希望返回与您的功能相关的内容。

    【讨论】:

      猜你喜欢
      • 2022-06-11
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-15
      • 2011-01-24
      • 2021-08-14
      • 1970-01-01
      相关资源
      最近更新 更多