簡體   English   中英

遞歸輸入數組 function 沒有循環 (.c)

[英]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+1size-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM