如何在C中调用相同的函数3次?

时间:2017-09-27 14:50:46

标签: c recursion

我正在试图弄清楚如何使用递归来调用自己3次的函数(在我的情况下,我做了一个笑脸)。我的老师对他的教学并不彻底,我不知道在代码中放什么来通过这种方法重复这个功能。我的代码看起来像

#include <stdio.h>

int main()
{
    printf("  * * * *\n");
    printf("*          *\n");
    printf("    .    .\n");
    printf("*          *\n");
    printf("*    \\_/   *\n");
    printf("*          *\n");
    printf("  * * * *\n");
    getchar();
    return 0;
}

4 个答案:

答案 0 :(得分:10)

对于递归,您需要两件事:

  1. 一个解决方案,该函数调用自身,但问题的“更简单”版本
  2. 不发生递归的基本情况
  3. 通常的例子是factorial。对于所有大于0的数字(这是第一部分)和0! is defined as 1(这是第二部分),n!n * (n - 1)!

    int factorial(int n) 
    {
        assert(n >= 0); // Otherwise, trouble!
        if (n == 0)
        {
            return 1;
        }
        else
        {
            return n * factorial(n - 1);
        }
    }
    

    因此,要将脸部打印三次,请先将其打印两次,然后再次打印。概括地说,对于n> 0,打印面部n - 1次,然后再次打印。对于n = 0,什么都不做。

    因此,您的递归函数应该使用参数n来告诉它打印面部的次数。如果n大于0,则应递归调用自身打印面n - 1次,然后再次打印面部。

    确切的代码,我会留给你。

答案 1 :(得分:2)

此代码有效。如果您不理解,请务必提出问题,并确保您理解代码,因为这是您的课程......

#include <stdio.h>

void smiley_print(int times_to_call)
{
    printf("  * * * *\n");
    printf("*          *\n");
    printf("    .    .\n");
    printf("*          *\n");
    printf("*    \\_/   *\n");
    printf("*          *\n");
    printf("  * * * *\n");
    getchar();
    if(--times_to_call) smiley_print(times_to_call);
}

int main()
{
    smiley_print(3);
    return 0;
}

答案 2 :(得分:2)

使递归函数执行doStuff() N次:

void repeatDoStuff(int N)
{
    if (N > 0)
    {
        doStuff();
        repeatDoStuff(N-1);
    }
}

Demo

答案 3 :(得分:1)

  

如何在C中调用相同的函数3次? (使用递归)

当一个简单的循环足够时,递归正确地收到了坏名声。

考虑下面的递归解决方案,其最大递归深度为O(n)

void print_face(int n) {  // recurse
  if (n > 0) {
    printf(A_string_representing_a_face);
    print_face(n-1);
  }
}

// vs.

void print_face(int n) {  // no recursion
  while (n > 0) {
    n--; 
    printf(A_string_representing_a face);
  }
}

//usage
print_face(3);

某些编译器会将模式标识为tail-recursive并发出与循环类似的代码。其他编译器不会看到这种情况并导致潜在的过度递归。 Stack Overflow

良好的递归:

  1. 检测何时不再需要递归,例如if (n == 0)
  2. 使显着更小的任务。
  3. 考虑下面的递归解决方案,其最大递归深度为O(log2(n))。如果n是300万,而不是如上所述的300万的递归深度,那么深度将是22.正是这个显着更小的任务使得一个好的递归解决方案 - 当一个简单的循环是不够的。

    void print_face(int n) {  // recurse
      if (n > 0) {
        printf(A_string_representing_a_face);
    
        n--; 
        print_face(n/2);
        print_face(n - n/2);
      }
    }