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の2番目の呼び出しが、最初の呼び出しが使用した元の値ではなく、makeBranchesの最初の呼び出しを返す原因となった値でのみ実行されることです。

4

2 に答える 2

3

同意します。の最初の呼び出しmakeBranches(left, (right+left)/2);が正しい間で括弧が異なります.makeBranches((right+left/2)+1, right);/2

2 行目makeBranches((right+left)/2+1, right);を提案どおりに変更し、値を確認します。

于 2012-11-03T20:02:45.680 に答える
0

あなたは意味がありません。C は parms を値で渡すため、2 番目の呼び出しで表示される parms を最初の呼び出しで変更することはできません。

しかし、再帰関数を使用すると、呼び出しの深さのどこにいるのか混乱するのは非常に簡単です。3番目の深さパラメータを渡して表示してみてください:

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 に答える