0

これが非常に些細な問題であることは理解しています。

ユーザーが 0 を入力するまで int としてユーザー入力を要求し続けるプログラムを作成しようとしています。その時点で終了し、すべての数字が逆に出力されます。これは私がこれまでに持っているものです:

int revList(int num)
{
    if (num != 0)
    {
        scanf("%d", &num);
        printf("%d\n", revList(num));
        return num;
    }
    return 0;
}

私の主な方法は次のとおりです。

int revList(int);

printf("%d", revList(1));

の 1 はrevList、最初の反復では役に立たないにもかかわらず、コンパイラの引数の必要性を満たすために任意に選択されました。

私のコードはおそらく非効率的であり、再帰を適切に利用していないことを理解しています。

コードは機能しますが、問題が 1 つあります。0 を 2 回出力してから、前の数字を出力します。問題の原因がどこにあるのかを理解しています。最後に戻り値0があるためですが、非void関数の最後に到達し、このように0を2回返すため、それを取り出すことができません。

誰かがこれを修正するのを手伝ってくれて、この問題に対処する効率的な方法を教えてくれませんか?

編集: 例: ユーザー入力: 1 2 3 4 5 8 0

出力する必要があります:

0 8 5 4 3 2 1

私のプログラムは次のように出力します: 0 0 8 5 4 3 2 1

4

4 に答える 4

2
void revList()
{
 int num = 0;
 scanf("%d", &num);

 if (num != 0)
     revList();

 printf("%d\n", num);       
}

理由が知りたい方は少し説明します。

まず、関数は整数を返す必要はありません。これは、ユーザーから数値を収集し、それをすべて 1 か所に出力するためです。必要はありません。

0 を一種の "kill コマンド" にしたいので、それを出力したくないのではないかと推測しています。

編集:

編集に従って、収集された 0 を印刷することを明確にします。それに応じてコードが変更されました

于 2013-10-02T18:23:00.157 に答える
1
void revList()
{
   int num = 0;
   if( std::cin >> num ) {
      if( num ) 
         revList();
      std::cout << num << std::endl;
   }
}
于 2013-10-02T18:17:22.187 に答える
0

あなたは試すことができます:

void revList()
{
    int num;
    scanf("%d", &num);

    if (num != 0)
    {
        revList();
    }
    printf("%d\n", num);
}
于 2013-10-02T18:22:26.653 に答える
0

仮引数を避けてこのように行うことができます。最初の数字を渡し、ゼロでない場合はゼロに達するまで再帰を実行し、前のレベルが返されたときに各再帰レベルで実際の数字を出力します。

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

int revList(int nValue)
{
    if(nValue != 0)
    {
        int nNextValue;
        scanf("%d", &nNextValue);
        revList(nNextValue);
        printf("%d", nValue);
    }
    return nValue;
}

int main(int argc, char** argv)
{
    int nValue;
    scanf("%d", &nValue);
    revList(nValue);
    return EXIT_SUCCESS;    
}
于 2013-10-02T18:33:18.017 に答える