递归解释

时间:2014-05-26 08:01:17

标签: c recursion

我正在尝试一个随机程序来练习递归。

我无法弄清楚发生了什么

int fun(int *list,int l,int h)
{
    if(l==h)
        return list[l];
    int b = fun(list,l+1,h)+ fun(list,l,h-1);
    printf("%d \n",b);
    return b;
}

void main()
{
    int ar[]= { 1,2,3,4};
    fun(ar,0,3);
}

有人可能会绘制递归树吗?另外每个点的b值是多少?谢谢!

3 个答案:

答案 0 :(得分:4)

您的应用程序的轻微重组可能会告诉您您想要看到的内容。修改算法以包含深度参数和一些带有参数指定左对齐的创意领先空间打印,这样就可以得到:

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

int fun(int *list, int l, int h, int d)
{
    printf("%*sfunc(list, %d, %d)\n", d, "", l, h);
    int b = (l==h) ? list[l] : fun(list, l+1, h, d+2)+ fun(list, l, h-1, d+2);
    printf("%*sresult: %d \n", d, "", b);
    return b;
}

int main()
{
    int ar[]= { 1,2,3,4};
    fun(ar, 0, 3, 0);
    return EXIT_SUCCESS;
}

结果有点说明了一切:

<强>输出

func(list, 0, 3)
  func(list, 1, 3)
    func(list, 2, 3)
      func(list, 3, 3)
      result: 4 
      func(list, 2, 2)
      result: 3 
    result: 7 
    func(list, 1, 2)
      func(list, 2, 2)
      result: 3 
      func(list, 1, 1)
      result: 2 
    result: 5 
  result: 12 
  func(list, 0, 2)
    func(list, 1, 2)
      func(list, 2, 2)
      result: 3 
      func(list, 1, 1)
      result: 2 
    result: 5 
    func(list, 0, 1)
      func(list, 1, 1)
      result: 2 
      func(list, 0, 0)
      result: 1 
    result: 3 
  result: 8 
result: 20 

通过一些修改(此处未显示;留给读者练习),您可以绘制与终端相关的线条艺术字符,以便更多地放大&#34;什么称为什么并返回什么?&#34 ;题。以下是使用VT100兼容转义序列的这种mod的输出(谢天谢地,它们在格式化方面很好地消耗)。享受!

┌func(list, 0, 3)
│ ┌func(list, 1, 3)
│ │ ┌func(list, 2, 3)
│ │ │ ┌func(list, 3, 3)
│ │ │ └result: 4
│ │ │ ┌func(list, 2, 2)
│ │ │ └result: 3
│ │ └result: 7
│ │ ┌func(list, 1, 2)
│ │ │ ┌func(list, 2, 2)
│ │ │ └result: 3
│ │ │ ┌func(list, 1, 1)
│ │ │ └result: 2
│ │ └result: 5
│ └result: 12
│ ┌func(list, 0, 2)
│ │ ┌func(list, 1, 2)
│ │ │ ┌func(list, 2, 2)
│ │ │ └result: 3
│ │ │ ┌func(list, 1, 1)
│ │ │ └result: 2
│ │ └result: 5
│ │ ┌func(list, 0, 1)
│ │ │ ┌func(list, 1, 1)
│ │ │ └result: 2
│ │ │ ┌func(list, 0, 0)
│ │ │ └result: 1
│ │ └result: 3
│ └result: 8
└result: 20

答案 1 :(得分:3)

我想它应该是这样的(虽然不是很好的树,但是我不知道如何绘制它):

fun(ar, 0, 3) -> { (prints 20)
    fun(ar, 1, 3) -> { (prints 12)
        fun(ar, 2, 3) -> { (prints 7)
            fun(ar, 3, 3) + fun(ar, 2, 2)
        } + fun(ar, 1, 2) -> { (prints 5)
            fun(ar, 2, 2) + fun(ar, 1, 1)
    } + fun(ar, 0, 2) -> { (prints 8)
            fun(ar, 1, 2) -> { (prints 5)
                fun(ar, 2, 2) + fun(ar, 1, 1)
            } + fun(ar, 0, 1) -> { (prints 3)
                fun(ar, 1, 1) + fun(ar, 0, 0)
            }
        }
    }

答案 2 :(得分:3)

1    fun(list,0,3)
2    = fun(list,1,3) + fun(list,0,2)
3    = fun(list,2,3) + fun(list,1,2) + fun(list,1,2) + fun(list,0,1)
4    = fun(list,2,2) + fun(list,3,3) + fun(list,1,1) + fun(list,2,2) + fun(list,1,1) + fun(list,2,2) + fun(list,0,0) + fun(list,1,1)

第4行没有任何printf语句。

第3行将打印

7
5
5
3

第二行将打印

12
8

第一行将打印

20