【问题标题】:How can I use recursion to reverse the user input?如何使用递归来反转用户输入?
【发布时间】:2013-10-02 18:10:44
【问题描述】:

我知道这是一个非常琐碎的问题。

我正在尝试编写一个程序,它将不断要求用户输入为 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 两次,然后打印前面的数字。我意识到问题出在哪里。这是因为我最后有一个 return 0 但我不能把它取出来,因为它会到达一个非 void 函数的末尾,并且以这种方式,它返回 0 两次。

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

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

它应该输出:

0 8 5 4 3 2 1

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

【问题讨论】:

  • @chris :D 这是个好答案... :D
  • @chris 如果在课堂上做this之类的作业,我对公共教育的一点信心已经正式破灭=P
  • @chris 你在大学学习这个?这个任务对你来说一定很简单。
  • @WhozCraig,所以我继续前进了一点。问题是每个人都无处不在,所以不从头开始被认为是不公平的。至少假设我们已经用另一种语言完成了所有这些工作。
  • @chris 是的,我们在美国也有这个,它似乎没有人想要谈论的“不让一个孩子掉队”的结尾条款:没有孩子领先。可恶的家伙,但是当您达到高级算法和数据结构类时,您有望开始获得可用的内容。

标签: c++ c recursion


【解决方案1】:
void revList()
{
 int num = 0;
 scanf("%d", &num);

 if (num != 0)
     revList();

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

如果你想知道原因,我会稍微解释一下。

首先,该函数不需要返回整数,因为您正在从用户那里收集数字将其全部打印在一个地方 - 根本不需要。

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

编辑:

根据您的编辑,您明确表示您确实想要打印收集到的 0。 代码相应更改。

【讨论】:

  • 哦,等等,我以前试过这个。我得到错误争论类型无效不完整。这就是我尝试创建返回类型 int 的原因。有什么问题?
  • 嗯,在您的原始代码中,您在 printf 中调用 revList()。如果那是你正在做的,那是行不通的。如果没有您当时拥有的代码,我将无能为力。
【解决方案2】:
void revList()
{
   int num = 0;
   if( std::cin >> num ) {
      if( num ) 
         revList();
      std::cout << num << std::endl;
   }
}

【讨论】:

  • @Nawaz:OP 的代码也没有。这也不是他想要的。阅读问题。
  • @Outlier 你问了 C++ 问题,这是 C++ 的输入/输出方式。如果标签有误请修改
  • @Nawaz 为什么你没有把你的 -1 和你的 cmets 放到其他 2 个答案中?更重要的是,为什么你没有提供“好”的答案?
【解决方案3】:

你可以试试:

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

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

【讨论】:

  • 逻辑有效,但我在第 10 行收到错误争论类型 void iscomplete。
【解决方案4】:

您可以这样做,避免使用虚拟参数,只需传入第一个数字,如果它不为零,则执行递归直到达到零,然后在上一级返回时打印每个递归级别中的实际数字:

#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;    
}

【讨论】:

  • s/void main/int main/
猜你喜欢
  • 2013-04-13
  • 2013-03-02
  • 2010-09-17
  • 2020-12-04
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 2016-03-05
  • 2021-04-08
相关资源
最近更新 更多