【问题标题】:c passing pointer to recursive functionc 将指针传递给递归函数
【发布时间】:2012-02-22 18:49:20
【问题描述】:

所以我在这个程序上苦苦挣扎,我试图找出如何使用 声明为 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 增量(当作为参数传递时),

【问题讨论】:

  • 此代码无法编译。而且你还没有初始化cnt 指向任何内存。

标签: c pointers memory-leaks recursion


【解决方案1】:
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 被传递,也是 i 之后取的值。
  2. i++:i被传递,调用后i = i + 1。
  3. i+1:i + 1 已通过,但之后 i 仍保持原样。

我也会尝试修复你的功能:

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

仍然有很多递归,但没有不停止的危险。

【讨论】:

  • 我没有意识到递归函数也需要工作。哦,是的,它们只是在无限递归中堆叠起来。
  • 您应该会收到编译警告 - 在 main() 中调用 f() 的参数 3 类型不匹配。您正在传递一个int **,函数需要一个int *
【解决方案2】:

处理指向函数的指针的简单方法是:

#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 ----

【讨论】:

    猜你喜欢
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多