可怕的递归

justhim 2004-01-05 10:26:11
#include <stdlib.h>
#include <stdio.h>

static unsigned long count;

long fact(int x) {
++count;
/* fact(0) is 1, negative numbers don't make sense so we pretend
* they're 1. */
if (x < 2) return 1;
return x * fact(x - 1);
}

int main(void)
{
int i;
long f;

for (i = 1; i < 20; ++i) {
count = 0;
f = fact(i);
printf("fact(%02d) gives %ld after %lu iteration%s.\n",
i, f, count, count == 1 ? "" : "s");
}

return 0;
}

输出结果:
fact(01) gives 1 after 1 iteration.
fact(02) gives 2 after 2 iterations.
fact(03) gives 6 after 3 iterations.
fact(04) gives 24 after 4 iterations.
fact(05) gives 120 after 5 iterations.
fact(06) gives 720 after 6 iterations.
fact(07) gives 5040 after 7 iterations.
fact(08) gives 40320 after 8 iterations.
fact(09) gives 362880 after 9 iterations.
fact(10) gives 3628800 after 10 iterations.
fact(11) gives 39916800 after 11 iterations.
fact(12) gives 479001600 after 12 iterations.
fact(13) gives 1932053504 after 13 iterations.
fact(14) gives 1278945280 after 14 iterations.
fact(15) gives 2004310016 after 15 iterations.
fact(16) gives 2004189184 after 16 iterations.
fact(17) gives -288522240 after 17 iterations.
fact(18) gives -898433024 after 18 iterations.
fact(19) gives 109641728 after 19 iterations.
...全文
44 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
justhim 2004-01-05
  • 打赏
  • 举报
回复
再用迭代看看,原来就这么简单。

#include <stdlib.h>
#include <stdio.h>

static unsigned long count;

long fact(int x) {
long accumulator = 1;
++count;
while (x > 1) {
accumulator *= x--;
}
return accumulator;
}

int main(void) {
int i;
long f;

for (i = 1; i < 20; ++i) {
count = 0;
f = fact(i);
printf("fact(%02d) gives %ld after %lu iteration%s.\n",
i, f, count, count == 1 ? "" : "s");
}

return 0;
}

输出结果:
fact(01) gives 1 after 1 iteration.
fact(02) gives 2 after 1 iteration.
fact(03) gives 6 after 1 iteration.
fact(04) gives 24 after 1 iteration.
fact(05) gives 120 after 1 iteration.
fact(06) gives 720 after 1 iteration.
fact(07) gives 5040 after 1 iteration.
fact(08) gives 40320 after 1 iteration.
fact(09) gives 362880 after 1 iteration.
fact(10) gives 3628800 after 1 iteration.
fact(11) gives 39916800 after 1 iteration.
fact(12) gives 479001600 after 1 iteration.
fact(13) gives 1932053504 after 1 iteration.
fact(14) gives 1278945280 after 1 iteration.
fact(15) gives 2004310016 after 1 iteration.
fact(16) gives 2004189184 after 1 iteration.
fact(17) gives -288522240 after 1 iteration.
fact(18) gives -898433024 after 1 iteration.
fact(19) gives 109641728 after 1 iteration.
justhim 2004-01-05
  • 打赏
  • 举报
回复
用goto看看这个递归在做什么。

#include <stdlib.h>
#include <stdio.h>

static unsigned long count;

long fact(int x) {
long accumulator = 1;
start:
++count;
/* fact(0) is 1, negative numbers don't make sense so we pretend they're 1. */
if (x < 2)
return accumulator;

/* we multiply the accumulator by our top-level x */
accumulator *= x;
/* and trim x by one */
x = x - 1;
goto start;
}

int main(void) {
int i;
long f;

for (i = 1; i < 20; ++i) {
count = 0;
f = fact(i);
printf("fact(%02d) gives %ld after %lu iteration%s.\n",
i, f, count, count == 1 ? "" : "s");
}

return 0;
}

输出结果:
fact(01) gives 1 after 1 iteration.
fact(02) gives 2 after 2 iterations.
fact(03) gives 6 after 3 iterations.
fact(04) gives 24 after 4 iterations.
fact(05) gives 120 after 5 iterations.
fact(06) gives 720 after 6 iterations.
fact(07) gives 5040 after 7 iterations.
fact(08) gives 40320 after 8 iterations.
fact(09) gives 362880 after 9 iterations.
fact(10) gives 3628800 after 10 iterations.
fact(11) gives 39916800 after 11 iterations.
fact(12) gives 479001600 after 12 iterations.
fact(13) gives 1932053504 after 13 iterations.
fact(14) gives 1278945280 after 14 iterations.
fact(15) gives 2004310016 after 15 iterations.
fact(16) gives 2004189184 after 16 iterations.
fact(17) gives -288522240 after 17 iterations.
fact(18) gives -898433024 after 18 iterations.
fact(19) gives 109641728 after 19 iterations.

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧