【问题标题】:This code is giving an absurd answer [duplicate]这段代码给出了一个荒谬的答案[重复]
【发布时间】:2012-09-04 14:46:12
【问题描述】:

可能重复:
What is really happening in this code?

我有一个包含递归函数的代码。我在递归上浪费了很多时间,但我仍然无法得到它,真的:

#include<stdio.h>

count(int);

 main(){
   int x=10,z;
   z=count(x);
}  
count(int m){
   if(m>0)
      return count(m-1);
}

count第一次用参数10调用时,它满足条件并开始递归。当函数调用自身时会发生什么?我不明白。声明return count(m-1) 是什么意思?它把控制权转移到哪里去了?

【问题讨论】:

  • 用内联函数在纸上画出来。您也根本没有扩展“荒谬的答案”。这有什么荒谬的?这是什么?
  • 我知道return 的含义,但我无法以递归方式得到它
  • 我希望打印 0-10 的编号,但它会像值一样打印 9939
  • 您的代码根本不打印任何内容,所以我不确定您为什么希望打印数字。
  • 这实际上永远不会返回任何东西。

标签: c function recursion


【解决方案1】:

函数count的返回值是未定义的,因为如果(m &lt;= 0)为真则没有默认返回。

C11, § 6.9.1 函数定义

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

此外,要了解递归函数的工作原理,您必须拿一篇论文并尝试自己执行代码(另请参阅here)。

【讨论】:

    【解决方案2】:

    m &lt;= 0 时,您需要count 才能返回某些内容。您应该声明count 的返回类型并使用-Wall 进行编译,以便编译器帮助您发现代码中的错误。

    【讨论】:

      【解决方案3】:

      recursion 意味着函数将调用自身,如果它是尾递归,则主要是在自身的末尾。

      因此,您的 count 函数会检查输入参数是否 > 0,如果是,它将调用 count(m-1)。现在它从count 的顶部开始,m=9。它做同样的事情,然后用 m=8 等调用 count。

      直到达到结束条件,通常应该在您的函数中明确满足,例如if (m == 0) return m; 或类似的东西。此时递归结束,函数终止。

      另外,count 应该有一个返回类型,比如int count (int m)

      【讨论】:

        【解决方案4】:

        语句 return count(m-1) 是什么意思?它把控制权转移到哪里去了?

        这似乎是你唯一的问题。

        这意味着它正在调用值为 m-1 的“count”。所以如果 m 是 10,那么它就是用 9 调用“count”。

        它将控制递归地转移到count方法。

        “count”方法中的每个可能路径也没有返回值。 如果 m

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-13
          • 2014-07-03
          • 2023-03-17
          • 1970-01-01
          • 2023-03-11
          • 2015-01-04
          • 1970-01-01
          • 2017-10-16
          相关资源
          最近更新 更多