汤姆叔叔的小屋 发表于 2020-4-17 15:24:20

c语言 递归 流程控制

#include<stdio.h>


void main()
{
        long recursion(int n);
        int n;
        long result;
        printf("input a integer number:\n");
        scanf("%d",&n);
       
        result = recursion(n);
        printf("%d! = %ld\n", n, result);
}
long recursion(int n)
{
        long temp_result;
       
        if(n < 0)
        {
                printf("n<0, input error\n");
        }
        else if(n==0 || n==1)
        {
                temp_result = 1;
        }
        else
        {
                temp_result = recursion(n - 1) * n;//这里①
        }
        return temp_result;//这里②
}
调试过程在long recursion(int n)中,进行到return temp_result;(即②处),函数没有以temp_result的值作为返回值直接跳出,而是又返回temp_result = recursion(n - 1) * n;(即①处),继续调试,以①到②,②到①,来回多次。
而我一直觉得只要一到②处,就应该直接输出返回值,结束函数。

sunrise085 发表于 2020-4-17 15:49:34

你这是递归,
每次调用函数都是到②处结束函数的。
之所以看到多次在①和②之间来回跳,是因为多次递归调用了recursion()函数
假如输入的是3
第一次调用函数,n=3,运行到①,进行递归调用
         第二次调用函数,n=2,运行到①,进行递归调用
                第三次调用函数,n=1,运行else if
                运行到②处,第三次调用结束,函数返回
      返回到①处,继续执行,运行②处,第二次调用结束,函数返回
返回到①处,继续执行,运行②处,第一次调用结束,函数返回
页: [1]
查看完整版本: c语言 递归 流程控制