【问题标题】:Hey, I've recently learned recurrsion and i want to know why isnt my code working it's in c [closed]嘿,我最近学习了递归,我想知道为什么我的代码不能在 c [关闭]
【发布时间】:2021-08-24 12:28:29
【问题描述】:

这里是代码

#include <stdio.h>

int print(int a[],int size)
{ int i=0;
if (size!=0) //4<4
{
    printf("%d",a[i]);
    return print(a[i+1],size-1); 
}

}
int main()
{ 
    int n,a[100],size;
        printf("Enter array size");
    scanf("%d",&size);
for (int i=0;i<size;i++)
{
    printf("Enter number u want to enter");
    scanf("%d",&a[i]);
}
 printf("%d",print(a,size));

}

我希望它采用 3 的大小作为示例,并具有 5 4 2 的数组并在 sequnece 5 4 2 中将它们打印出来,但相反,它会运行所有内容并接受输入,但会再次打印输出。

【问题讨论】:

  • 在这种情况下你如何定义not working
  • idk 它像运行一样工作,但它不打印输出它只需要它
  • 您可能需要在 printf 语句中使用 \n 来编写输出。
  • 它不写输出它只接受输入并停止
  • edit问题并显示您使用的输入、您获得的输出(ar 表示您没有获得任何输出)以及您想要获得的预期输出。

标签: arrays c recursion printf function-definition


【解决方案1】:

对于初学者来说,函数名称find(在更新之前在您的问题中使用)令人困惑。你试图在函数中找不到任何东西。

您的函数实际上什么也不返回。所以返回类型int没有意义。

因此调用

printf("%d",print(a,size));

还调用未定义的行为。

在本次通话中

return find(a[i+1],size);

表达式a[i+1] 的类型为int,而不是函数声明所需的int *。此外,由于其声明,变量i 在函数的每次递归调用中始终等于0

int i=0;

如果你只想输出一个数组,那么函数可以看起来像下面这样

void print_array( const int a[], size_t size)
{
    if ( size != 0 )
    {
        printf( "%d", *a );
        print_array( a + 1, size - 1 );
    }
}

【讨论】:

  • 什么是常量?和 size_t
  • @NadineMohamed 限定符 const 表示传递的数组在函数内没有改变。由于数组不能有负数元素,因此应使用无符号整数类型指定元素数。 size_t 类型是运算符 sizeof 中使用的表达式的类型。
【解决方案2】:

代码有几个问题。也许最重要的是:

if (i<size+1)

如果数组a 的长度仅为size 元素,则尝试从a[size] 读取时的行为未定义。在您的情况下,如果 size &lt; 100 这不是问题,但应该是 if( i &lt; size )

还有:

return find(a[i+1],size); 

find 期望 int * 作为其第一个参数,而您传递的是 inta[i+1] 的值肯定不是一个有效的内存位置(确实,i+1 超出了a 的范围,所以仅仅试图读取a[i+1] 是未定义的行为),所以第一次访问a在调用中会导致未定义的行为。相反,请尝试find(a + 1, size - 1)

一旦你解决了这些问题,代码应该“工作”。

【讨论】:

    【解决方案3】:
    #include <stdio.h>
    
    void find(int a[],int size){
      int i=0;
    
      if (i<size){
          printf("%d",a[i]); //5
          find(a[i+1],size);
      }
    
    }
    
    int main(){
      int n,a[100],size;
    
      printf("Enter array size");
      scanf("%d",&size);
    
      for (int i=0;i<size;i++){
          printf("Enter number u want to enter");
          scanf("%d",&a[i]);
      }
    
       find(a,size);
    }
    

    【讨论】:

    • 标题说你学会了递归,但代码证明你没有。或许可以解释一下find 的工作原理。
    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 2022-08-09
    • 2014-02-16
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多