[英]Input array with recursively function without loops (.c)
我需要寫一個 function 來輸入數組的大小並分配 memory,然后讀取(scanf)值到這個數組。
我寫了這個 function 但它不起作用:
void getss(int array[], int size)
{
int counter = 0;
if (size == 0)
return;
if (counter < size) {
scanf("%d", &array[i]);
counter++;
}
getss(array, size - 1);
}
目前尚不清楚您要實現的目標。 但我猜你的數組參數在遞歸調用中不正確。 現在所有對 getss 的調用都得到相同的數組,但大小不同。 (變量我來自哪里?變量計數器在發布的代碼中沒有多大用處。)
我假設您需要更新數組指針以指向遞歸調用中數組中的下一個元素。 換句話說,傳遞數組中第二個元素的地址而不是第一個元素(當前行為)。 這與遞歸調用中的 size-1 一致。
實現是微不足道的,但作為練習留給海報,因為這對我來說就像作業。
你有不需要的變量。 這是您要實現的目標嗎:
下面將填充數組,以便使用 scanf() 讀取的第一個值將存儲在最后一個元素中。
void getss(int array[], int size)
{
if (size == 0)
return;
scanf("%d", &array[size-1]);
getss(array, size - 1);
return;
}
下面將填充數組,以便使用 scanf() 讀取的第一個值將存儲在第一個元素中。
void getss(int array[], int size)
{
if (size == 0)
return;
scanf("%d", &array[0]);
getss(&array[1], size - 1);
return;
}
如果你要迭代地做這件事,你會怎么做? 我會假設是這樣的:
void getss(int array[], int size) {
int i;
for (i = 0; i < size; i++) {
scanf("%d", array[i]);
}
}
我們的i
只是用來計算我們通過數組的方式,所以如果我們稍微改變我們的函數,我們可以擺脫它:
void getss(int* array, int size) {
for (; size > 0; size--, array++) {
scanf("%d", array);
}
}
現在我們的“計數器”是大小變量本身,而不是在我們的數組中索引,我們只是繼續向前推進指向它的指針。
現在這是一個完美的形式,可以變成一個遞歸函數。 我們可以將新值傳遞給函數末尾的另一個對getss
調用,而不是size--
和array++
:
void getss(int* array, int size) {
if (size > 0) {
scanf("%d", array);
getss(array + 1, size - 1);
}
}
所以我們循環的終止條件已經移動到if
and 而不是array++
和size--
我們將array+1
和size-1
傳遞給我們的下一個調用。 它實現了與循環相同的結果,但沒有顯式循環結構。
#include<bits/stdc++.h>
using namespace std;
int a[100];
void input(int n)
{
if(n==0)
{
return;
}
input(--n);
cin>>a[n];
}
int main()
{
int n=4;
input(n);
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
}
除了其他問題,使用counter
什么意義? 它是 0 或 1,並且永遠不會傳遞給下一個調用。 它應該被聲明為靜態的嗎?
#include <stdio.h>
#include <stdlib.h>
void getss(int* array, int size){
if (size == 0)
return;
scanf("%d", array);
getss(++array, size - 1);
}
int main(){
int *array;
int i, size;
printf("input array size:");
scanf("%d", &size);
array = (int*)malloc(sizeof(int)*size);
getss(array, size);
for(i=0;i<size;i++){
printf("array[%d]=%d\n", i, array[i]);
}
return 0;
}
void getss(int array[], int size , int counter)
{
if (size == 0)
return;
if (counter < size) {
scanf("%d", &array[i]);
counter++;
}
getss(array, size - 1, counter);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.