我正在试图弄清楚如何使用递归来调用自己3次的函数(在我的情况下,我做了一个笑脸)。我的老师对他的教学并不彻底,我不知道在代码中放什么来通过这种方法重复这个功能。我的代码看起来像
#include <stdio.h>
int main()
{
printf(" * * * *\n");
printf("* *\n");
printf(" . .\n");
printf("* *\n");
printf("* \\_/ *\n");
printf("* *\n");
printf(" * * * *\n");
getchar();
return 0;
}
答案 0 :(得分:10)
对于递归,您需要两件事:
通常的例子是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);
}
}
答案 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
良好的递归:
if (n == 0)
考虑下面的递归解决方案,其最大递归深度为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);
}
}