如何使用递归来反转用户输入?

时间:2013-10-02 18:10:45

标签: c++ c recursion

我知道这是一个非常微不足道的问题。

我正在尝试编写一个程序,它将继续要求用户输入为int,直到用户输入0,此时它将终止并反向打印所有数字。这就是我到目前为止所做的:

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));

revList中的1是任意选择的,以满足编译器对争论的需要,即使它在第一次迭代中没用。

我理解我的代码可能效率低,而且没有正确使用递归。

代码有效,但有1个问题:它打印0次,然后是前面的数字。我意识到问题源于何处。这是因为我在结尾处有一个返回0但是我不能把它拿出来因为它将到达非void函数的末尾并且以这种方式返回0两次。

有人可以帮我解决这个问题并给我一个有效的方法来解决这个问题吗?

编辑: 示例:用户输入: 1 2 3 4 五 8 0

它应输出:

0 8 五 4 3 2 1

我的程序将输出: 0 0 8 五 4 3 2 1

4 个答案:

答案 0 :(得分:2)

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

 if (num != 0)
     revList();

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

如果你想知道推理,我会解释一下。

首先,该函数不需要返回一个整数,因为你正在从用户收集数字并在一个地方打印它 - 根本不需要。

我猜你想让0成为一种“杀戮命令”,因此,你不想打印它 - 因此我们将调用移到if语句中的printf。

编辑:

根据您的编辑,您明确表示您执行想要打印收集的0。 代码也相应改变了。

答案 1 :(得分:1)

void revList()
{
   int num = 0;
   if( std::cin >> num ) {
      if( num ) 
         revList();
      std::cout << num << std::endl;
   }
}

答案 2 :(得分:0)

您可以尝试:

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

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

答案 3 :(得分: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;    
}