0
#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 返回的值而不是第一次调用使用的原始值执行。

4

2 回答 2

3

我同意。你的括号在第一次调用makeBranches(left, (right+left)/2);是正确的之间是不同的 - 第二次调用makeBranches((right+left/2)+1, right);包括/2括号里面,这搞砸了操作的顺序。

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

于 2012-11-03T20:02:45.680 回答
0

你没有道理。C 通过值传递 parms,因此第二次调用看到的 parms 不能被第一次调用修改。

但是对于递归函数,很容易混淆你在调用深度中的位置。尝试传递并显示第三个深度参数:

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);
  }
}

因此,您可以跟踪您在调用堆栈中的深度。您还可以传递一个参数,指示它是“左”调用还是“右”调用。

于 2012-11-03T18:08:16.963 回答