c передачей указателя на рекурсивную функцию - PullRequest
3 голосов
/ 31 января 2012

Так что здесь я борюсь с этой программой, я пытался выяснить, как я могу использовать массив указателей, объявленных в main, в рекурсивной функции для запоминания данных, здесь возникает вопрос, если это такой же подход, какдля одного указателя, а как насчет типа структуры?Каков наилучший способ передать ссылку / массив на рекурсивную функцию?

#include <stdio.h>
#include <stdlib.h>
#define N 1

void f(int i,int j,int *cnt);

int j=0;

int main(int argc, char *argv[])
{
  int *cnt=0;
  f(0,++j,&cnt);
  printf("------ %d ---- \n",cnt);
  system("PAUSE");  
  return 0;
}

void f(int i,int j,int *cnt){

   if(i>N){
          printf("---if --- %d ---- %d \n",i,j);
          (*cnt)++;
          return;
          }

   (*cnt)++;
   printf("---bg --- %d ---- %d \n",i,j);
   f(i+1,++j,cnt);
   f(i+1,++j,cnt);        
}

Еще одна вещь, которую я хотел бы знать, - как рекурсивные функции обрабатывают ++ i, i ++ и i+1 шаг (при передаче в качестве параметров),

Ответы [ 2 ]

4 голосов
/ 31 января 2012
int main(int argc, char *argv[])
{
    int *cnt=0;
    f(0,++j,&cnt);
    printf("------ %d ---- \n",(*cnt));
    system("PAUSE");  
    return 0;
}

должно быть

int main(int argc, char *argv[])
{
    int intStorage = 0;//<---- As Oli said.
    int *cnt= &intStorage;
    f(0,++j,cnt);//<-------AMPERSAND removed, overly dereferenced.
    printf("------ %d ---- \n",(*cnt));
    system("PAUSE");  
    return 0;
}

++ i и i ++ и i + 1 (при передаче в качестве параметров):

  1. ++ i: i + 1 передается и также является значением, которое я принимаю впоследствии.
  2. i ++: i передается и i = i + 1 после вызова.
  3. i + 1: i + 1 пройден, но я остаюсь таким же, как и я.

Я тоже попытаюсь исправить вашу функцию:

void f(int i,int j,int *cnt){

    if(i>N){
        printf("---if --- %d ---- %d \n",i,j);
        return;
    }

    (*cnt)++;
    printf("---bg --- %d ---- %d \n",i,j);
    if ( i < 50 && j < 50 ) {
        f(i+1,++j,cnt);
        f(i+1,++j,cnt);
    }
}

Все еще много рекурсии, но без опасности не остановиться.

2 голосов
/ 31 января 2012

Простой способ обработки указателя в вашей функции:

#include <stdio.h>
#include <stdlib.h>
#define N 1

void f(int i, int j, int *cnt);

int j = 0;

int main(void)
{
    int cnt = 0;
    f(0, ++j, &cnt);
    printf("------ %d ----\n", cnt);
    return 0;
}

void f(int i, int j, int *cnt)
{
   // Having a local variable j and a global j is likely to confuse someone!
   if (i > N)
   {
      printf("---if --- %d ---- %d\n", i, j);
      return;
   }

   (*cnt)++;
   printf("---bg --- %d ---- %d\n", i, j);
   f(i+1, ++j, cnt);
   f(i+1, ++j, cnt);
}

Этот код создает следующий вывод без сбоев:

---bg --- 0 ---- 1
---bg --- 1 ---- 2
---if --- 2 ---- 3
---if --- 2 ---- 4
---bg --- 1 ---- 3
---if --- 2 ---- 4
---if --- 2 ---- 5
------ 3 ----
...