【问题标题】:Where are my errors in reasoning? (Recursion C)我的推理错误在哪里? (递归 C)
【发布时间】:2021-04-25 21:08:18
【问题描述】:

所以我想做一个递归函数,将一个数字乘以 2。它适用于按值调用。我的问题是我不能使用引用调用。我的意思是它会编译,但我会收到警告。至少我不知道如何正确地做到这一点,也许你可以帮助我?

#include <stdio.h>
#include <stdlib.h>


int *rekursion(int *n){
    if((*n) > 1000){
       return 0;
    }
    printf("%d\t",(*n));
    return rekursion((*n)*2);
}


int main() {

int n  = 10;

rekursion(&(n));

printf("%d",n);
    return 0;
}
Error: 
test16.c:15:22: warning: passing argument 1 of 'rekursion' makes pointer from integer without a cast [-Wint-conversion]

   15 | return rekursion((*n)*2);
      |                  ~~~~^~
      |                      |
      |                      int

test16.c:9:21: note: expected 'int *' but argument is of type 'int'
    9 | int *rekursion(int *n){

提前致谢!

【问题讨论】:

  • 抱歉
  • 好吧,在你的主函数中你传递了一个指针,而在函数中你传递了一个整数。为什么还要通过引用传递它?
  • return rekursion((*n)*2); 应该做什么? (*n)*2 取消引用指针并乘以 2。但这不是 rekursion() 函数所期望的指针。你想在调用函数之前加倍*n吗?
  • 确实如此,我现在看到了。我只是想参考一下,有没有办法参考一下?
  • 所以我想将 n 的值加倍,只是我可以在休息后在我的主函数中执行 printf。

标签: c pointers recursion pass-by-reference


【解决方案1】:

无法编译,因为recursion 函数需要一个指向内存地址的指针,而您正在传递一个值。

看这个:int *rekursion(int *n) 需要一个指针(内存地址)。
然后,这个:return rekursion((*n)*2); 这不是一个指针,它是一个右值。

int *rekursion(int *n){
 
   if((*n) > 1000){
      return 0;
   }
   printf("%d\t",(*n));

   // assign the value that the pointer n points multiplied by two, and then. 
   *n = (*n) * 2;
   return rekursion(n);
}

您不需要返回指针。 你可以这么写:

void rekursion(int *n){

   if((*n) > 1000){
      return ;
   }
   printf("%d\t",(*n));
   *n = (*n) * 2;
   rekursion(n);
}

【讨论】:

    【解决方案2】:

    刚刚更改了我的程序,我明白了,感谢您的启发!

    int rekursion(int *n){
    
    if((*n) > 1000){
       return 0;
    }
    printf("%d\t",(*n));
    *n = *n * 2;
    
    return rekursion(n);
    }
    
    
    int main(){
    
    int n  = 10;
    
    rekursion(&(n));
    
    printf("%d",n);
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      不需要指针。你可以这么写:

      return rekursion(n);
      

      完整程序

      #include <stdio.h>
      #include <stdlib.h>
      
      int *rekursion(int *n) {
          if(*n > 1000) {
              return 0;
          }
          *n *= 2;
          printf("%d\t",*n);
          return rekursion(n);
      }
      
      
      int main() {
          int n  = 10;
          rekursion(&n);
      
          printf("%d",n);
          return 0;
      }
      

      【讨论】:

      • 不需要第二个()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      相关资源
      最近更新 更多