连续两次调用递归函数

时间:2012-11-03 18:01:18

标签: c

#include <stdio.h>

#define LENGTH 16

void makeBranches(int, int);
void display(int, int);

int main(){

  makeBranches(0, LENGTH-1);
}

void makeBranches(int left, int right){

  if(left >= right){
    return;
  } else{
    display(left, right);
    makeBranches(left, (right+left)/2);
    makeBranches((right+left/2)+1, right);
  }
}

void display(int left, int right){
  printf("%d, %d", left, right);
  int mid = (left+right)/2;
  int i;

  for(i = left; i <= right; i++){
    if(i == mid)
      printf("X");
    else
      printf("-");
  }

  if(right == LENGTH-1)
    printf("\n");

}

我遇到的问题是makeBranches的第二次调用仅使用导致第一次调用makeBranches的值而不是第一次调用所使用的原始值来执行。

2 个答案:

答案 0 :(得分:3)

我同意。在makeBranches(left, (right+left)/2);的第一次调用是正确的情况下,您的括号是不同的 - makeBranches((right+left/2)+1, right);的第二次调用包括括号内的/2,这会破坏操作的顺序。

按照建议将第二行更改为makeBranches((right+left)/2+1, right);,然后查看值。

答案 1 :(得分:0)

你没有意义。 C按值传递参数,因此第一次调用无法修改第二次调用所看到的参数。

但是使用递归函数很容易与调用深度中的位置混淆。尝试传递&amp;显示第三个深度参数:

void makeBranches(int left, int right, int depth){

  if(left >= right){
    return;
  } else{
    display(left, right, depth);
    makeBranches(left, (right+left)/2, depth+1);
    makeBranches((right+left/2)+1, right, depth+1);
  }
}

因此,您可以跟踪调用堆栈的深度。你也可以传递一个parm,表明它是“左”呼叫还是“正确”呼叫。