-3

可能重复:
这段代码中到底发生了什么?

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

#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

4 回答 4

5

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

C11, § 6.9.1 函数定义

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

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

于 2012-09-04T14:50:31.827 回答
1

您需要countm <= 0. 您应该声明返回类型count并进行编译,-Wall以便编译器帮助您发现代码中的错误。

于 2012-09-04T14:50:01.403 回答
0

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

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

直到达到结束条件,通常应该在您的功能中明确满足,例如if (m == 0) return m; 或一些这样的事情。此时递归结束,函数终止。

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

于 2012-09-04T14:51:10.470 回答
0

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

这似乎是你唯一的问题。

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

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

在“count”方法中,您也没有返回每个可能的路径。如果 m <= 0 会发生什么?

于 2012-09-04T14:51:24.663 回答