#c #recursion
#c #рекурсия
Вопрос:
я новичок в программировании и изучаю рекурсию, я выполняю упражнение 4 с этой страницы https://www.w3resource.com/c-programming-exercises/recursion/index.php , я пытаюсь напечатать элементы массива, как только значение «i» в рекурсивной функции достигает значения «n», однако, как только я запускаю программу, она печатаетзначения мусора, которые я think.my вопрос в том, почему он это делает? почему он не печатает значения массива?
#include <stdio.h>
#include <stdlib.h>
void printr(int n,int i);
int main (void)
{
printf("NUMBER OF ELEMENTS:n");
int n;
scanf("%i",amp;n);
printr(n,0);
}
void printr(int n,int i)
{
int arr[n];
if (i == n)
{
for (int j = 0; j < n; j )
{
printf("%d",arr[j]);
return;
}
}
printf("element %d :n",i 1);
int e;
//scan for input
scanf("%d",amp;e);
//populate array
arr[i]=e;
//do it again
printr(n,i 1);
}
Затем я решил эту проблему, передав массив, определенный в функции mein, в качестве аргумента в функции printr
. это сработало, но я не понимаю, почему моя первая попытка не сработала?
#include <stdio.h>
#include <stdlib.h>
void printr(int arr[],int n,int i);
int main (void)
{
printf("NUMBER OF ELEMENTS:n");
int n;
scanf("%i",amp;n);
int arr[n];
printr(arr,n,0);
}
void printr(int arr[],int n,int i)
{
if (i == n)
{
for (int j = 0; j < n;j )
{
printf("%d ",arr[j]);
}
printf("n");
return;
}
printf("element %d :n",i 1);
int e;
//scan for input
scanf("%d",amp;e);
//populate array
arr[i] = e;
//do it again
printr(arr,n,i 1);
}
Спасибо!
Комментарии:
1. Вы не инициализируете значения перед печатью. Почему это вообще рекурсивно? Это обратный способ сделать это. Цикл, заполнение, затем печать. Подход, который у вас здесь, совершенно извращен и запутан.
2. 🔎🐞 Запускал ли ваш код в отладчике , чтобы увидеть, где возникает эта ошибка, затем запускал его снова с точкой останова рядом с этим сбоем, чтобы вы могли осторожно продвигаться вперед и наблюдать, что происходит до этой точки?
3. У каждого рекурсивного вызова есть свои собственные
int arr[n];
. В отличие от того, что передается изmain
, они являются отдельными массивами, а не общими.4. @WeatherVane Ах, я смотрел только на второе.
Ответ №1:
Потому что базовый C: каждый вызов printr
имеет свой собственный arr
в стеке, изначально неинициализированный. И вы печатаете его, не инициализируя его сначала.
Ответ №2:
Когда вы распечатываете значение, оно не инициализируется первым. Когда вы создаете переменную для печати, она указывает на место в памяти. Вероятно, эта память была освобождена другой программой (так что ее можно использовать). Как таковой, он содержит «мусорные» данные. Способ справиться с этим — инициализировать ваши значения.
Чтобы избежать подобных вещей в будущем, заведите привычку устанавливать свои указатели на NULL
то, когда вы их не инициализируете, чтобы ваши программы прерывались при попытке прочитать неинициализированное значение.