这段代码给出了一个荒谬的答案

时间:2012-09-04 14:46:13

标签: c function recursion

  

可能重复:
  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)的含义是什么?它在哪里转移控制?

4 个答案:

答案 0 :(得分:5)

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

  

C11,§6.9.1函数定义

     

如果到达了终止某个函数的},则该值为。{   函数调用由调用者使用,行为未定义。

此外,要了解递归函数的工作原理,您必须自己动手执行代码(另请参阅here)。

答案 1 :(得分:1)

count时需要m <= 0返回一些内容。您应该声明返回类型count并使用-Wall进行编译,这样编译器将帮助您在代码中发现错误。

答案 2 :(得分:0)

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

所以你的count函数会检查输入参数是否为&gt; 0然后如果是,则调用count(m-1)。现在它从count的顶部开始,m = 9。它做同样的事情,然后用m = 8等调用count。

直到达到最终条件,通常应该在您的函数中明确地提供,例如if (m == 0) return m;或某些此类事情。此时递归结束,函数终止。

此外,count应具有返回类型,例如int count (int m)

答案 3 :(得分:0)

  

语句返回计数(m-1)是什么意思?它在哪里转移控制?

这似乎是你唯一的问题。

这意味着它使用值m-1调用“count”。所以如果m是10,那么它用9来调用“count”。

它将控制递归地传递给count方法。

“count”方法中的每个可能路径也没有返回。 如果m是&lt; = 0?

会发生什么