以下递归代码的逻辑是什么?

时间:2015-08-23 11:19:10

标签: c recursion

请您解释以下代码的功能

int main()
{
    func1(10, 18);
    return 0;
}
func1(int a, int b)
{
    if (a > b)
        return;
    func1(a, b - 1);
    printf("%d ", b);
}

以下代码给出 18 17 16 15 14 13 12 11 10

1 个答案:

答案 0 :(得分:2)

我将在下面的程序中解释逻辑,因为您的程序在编译时会发出警告,因为您没有从旨在返回int的函数返回int

程序:

int main()
{
    func1(10, 18);
    return 0;
}

void func1(int a, int b)
{
    if(a > b)
        return;

    func1(a, b - 1);

    printf("%d ", b);
}

说明:

  1. 首先从func1调用main,参数分别为10和18:

    func1(10, 18);
    
  2. 条件if(a > b)为false,因为a(目前为10)不小于b(目前为18)
  3. func1调用第二个func1,参数分别为10和17:

    func1(a, b - 1);
    
  4. 条件if(a > b)为false,因为a(目前为10)不小于b(目前为17)
  5. func1调用第三个func1,参数分别为10和16:

    func1(a, b - 1);
    
  6. 条件if(a > b)为false,因为a(目前为10)不小于b(目前为16)
  7. func1调用第四个func1,参数分别为10和15:

    func1(a, b - 1);
    
  8. 条件if(a > b)为false,因为a(当前为10)不小于b(目前为15)
  9. 第五个func1func1调用,参数分别为10和14:

    func1(a, b - 1);
    
  10. 条件if(a > b)为false,因为a(目前为10)不小于b(目前为14)
  11. 第六个func1func1调用,参数分别为10和13:

    func1(a, b - 1);
    
  12. 条件if(a > b)为false,因为a(目前为10)不小于b(目前为13)
  13. func1调用第7 func1个参数分别为10和12:

    func1(a, b - 1);
    
  14. 条件if(a > b)为false,因为a(目前为10)不小于b(目前为12)
  15. func1调用第8 func1个参数分别为10和11:

    func1(a, b - 1);
    
  16. 条件if(a > b)为false,因为a(当前为10)不小于b(目前为11)
  17. func1调用第9个func1,参数分别为10和10:

    func1(a, b - 1);
    
  18. 条件if(a > b)为false,因为a(目前为10)不小于b(目前为10)
  19. func1调用第10 func1个参数分别为10和9:

    func1(a, b - 1);
    
  20. 条件if(a > b) 为真,因为a(当前为10)小于b(目前为9)。因此,执行return语句并完成第十func1的执行。
  21. 第九个func1从已停止的地点开始(func1(a, b - 1);)并打印 10 (因为当前b的值为10)并结束执行。
  22. 第八个func1从停止的地点开始(func1(a, b - 1);)并打印 11 (因为当前b的值为11)并结束执行。
  23. 第七个func1从停止的地点开始(func1(a, b - 1);)并打印 12 (因为当前b的值为12)并结束执行。
  24. 第六个func1从已停止的地点(func1(a, b - 1);)开始并打印 13 (因为当前b的值为13)并结束执行。
  25. 第五个func1从已停止的地点(func1(a, b - 1);)开始并打印 14 (因为b的值当前为14)并结束执行。
  26. 第四个func1从已停止的地点(func1(a, b - 1);)开始并打印 15 (因为当前b的值为15)并结束执行。
  27. 第三个func1从已停止的地点(func1(a, b - 1);)开始并打印 16 (因为b的值目前为16)并结束执行。
  28. 第二个func1从已停止的地点(func1(a, b - 1);)开始并打印 17 (因为当前b的值为17)并结束执行。
  29. 第一个func1从已停止的地点(func1(a, b - 1);)开始并打印 18 (因为b的值目前为18)并结束执行。
  30. 执行返回main并执行return 0;,终止程序。