c - 试图理解 C 中的递归

标签 c recursion

我试图理解下面的 C 代码是如何工作的:

int factorial(int n) {
   int result;
   if(n==0){
       result=1;
    }else{
       result = n * factorial(n-1);
   }
   return result;
}

我知道输出是 n 的阶乘。我想我想了解这个递归示例是否使用 if 语句作为递归的原因。是否也可以使用 for 循环而不是 if 来执行递归?还是我完全错过了重点?

最佳答案

I guess Im trying to understand if this example of recursion is using the if statement as the cause for recursion.

递归的原因是函数调用自身。 if (n == 0) 条件告诉我们何时停止递归。

如果我们调用 factorial(3),递归看起来像这样:

factorial(3):
  return 3 * factorial(2): -----------+
     return 2 * factorial(1); ------+ |
       return 1 * factorial(0); --+ | |
         return 1;                | | |
       1; <-----------------------+ | |
     2; <---------------------------+ |
  6; <--------------------------------+

And can recursion for this also be performed with a for loop instead of the if?

在这种情况下您不会使用循环 - 递归本身就是一种循环。

对于计算阶乘、斐波那契数等,我认为迭代算法(循环)优于递归算法:

int factorial_iter( int n )
{
  int result = 1;
  while ( n )
    result *= n--;
  return result;
}

因为与进行 n 单独的函数调用相比,开销非常小。但是,使用递归定义,阶乘更容易表达:

n! = n * n-1!, 0! = 1

所以你经常看到它被用作编程中递归的例子。事实上,像 Haskell 这样的语言几乎遵循数学符号:

factorial :: Int -> Int
factorial 0 = 1
factorial n = n * factorial( n - 1 )

任何可以递归解决的问题都可以迭代解决,尽管有些解决方案(快速排序、树遍历等)更容易递归实现。

例如,一个中序树的遍历可以写成

 /**
  * Perform an inorder traversal by
  * visiting the left subtree, then the root,
  * then the right subtree.
  */
 void inorder( node_type *t )
 {
   if ( !t )
     return;

   inorder( t->left );
   do_something_with( t->data );
   inorder( t->right );
 }

这比尝试编写一个循环以正确的顺序访问所有节点要简单得多。

关于c - 试图理解 C 中的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53714480/

相关文章:

c++ - 魔方回溯和递归 C++

c - 我的 int 数组怎么可能没有正确初始化

c - 初始化一个二维字符串数组并打印

c - 将文本文件中的数据保存到C中的数据结构

scala - Scala是否有更好的表达“ self 递归泛型类型”的方法?

c - 实现一个函数以递归方式返回有效的获胜条件 - C

c - IPPROTO_RM 在接受调用期间阻塞

c - 客户端如何使用预存的服务器证书进行SSL握手?

c# - 从字符串生成子字符串的组合

Golang中结构的递归函数