【问题标题】:How to print digits in ascending order from 1 to n using recursion ,where n is given in the parameter of that function [closed]如何使用递归以从 1 到 n 的升序打印数字,其中 n 在该函数的参数中给出 [关闭]
【发布时间】:2018-01-23 04:38:53
【问题描述】:

我的初始伪代码如下所示

int ascend(int n) {
    Print number
    Return ascend
}

我可以从 n 打印到零...但是如何使用递归从零打印到 n?

但是,我设法按升序从零数到 n 个数字。 这是实现

#include<iostream>
using namespace std;

int countUp(int bound,int fixed) /*both parameters are passed by same 
            value whereas for every function call the 'bound' 
            variable will change and the 'fixed' variable will remain 
            as it is */
{
  int x = fixed;
  int y = bound-x;
  if(bound>2*fixed)
  {
    return 0;
  }
  else
    cout<<y<<endl;

  return countUp(bound+1,fixed);
}

int main()
{
  int var;
  cout<<"Please input the upper bound"<<endl;
  cin>>var;
  countUp(var,var);
}

【问题讨论】:

  • 选择一种语言,编写您的代码。当您遇到特定问题时再回来。
  • 在询问之前至少尝试一下。
  • 看起来这是你的功课。首先告诉你解决问题的方法
  • 我想打印从 1 到 n 的数字的一般方法是先打印从 1 到 n-1 的数字,然后将 n 放在最后。
  • 你的伪代码差不多了 - 1. 你需要在调用提升之前获取下一个值。 2.你需要知道什么时候停止 3.print语句的位置会决定你是打印0-n还是n-0。

标签: java c++


【解决方案1】:

如果您对什么是递归有点模糊,this resource explains it well (in a Java context)

让我们来看看你的伪代码:

int ascend(int n) {
    Print number
    Return ascend
}

目前有几个问题:

  1. 它不知道何时停止
  2. 您不会使用值调用提升
  3. 您目前无法获取序列中的下一个值
  4. 您无需退货

知道了,很容易解决:

(计数)

ascend(int current, int end)
    if current <= end  
        Print number;
        ascend current + 1;

请记住,打印语句的位置将决定您打印升序还是降序;如果它在递归调用之前,它将按升序打印。同样,如果它在递归调用之后,它将按降序打印。

(倒计时)

descend(int n)
   if n >= 0
      Print n
      descend n - 1

【讨论】:

  • 我可以建议你用伪代码而不是勺子来回答。顺便说一句,您只需 1 个参数就可以更简洁地实现这一点;您可能想尝试一下。 ;) (提示:您的递归终止条件应为=0
  • @CraigYoung 为反馈干杯。 =0 的终止条件会假设用户没有提供负值,这是我不愿意做出的假设;)
  • 好的,使用&gt;0。最坏的情况,单张打印负片(这也可以有一个简单的条件来避免)。堆叠展开有一种简单的优雅,我相信这个练习旨在传授给学生。
  • 但是有没有机会只使用一个应该是计数上限的参数来计数?
  • @MahmudUnNabi 打印的位置会影响您是否给出向上计数或向下计数的错觉。之所以这样命名descend 方法,是因为它的实现是从顶部开始向下移动的——但是如果你移动了print 语句,它会产生相反的效果。
【解决方案2】:

一种可能的解决方案,使用您的模板:

#include <iostream>

static int i = 0;
void ascend(int n) {
    if(i >= n) {
        i = 0;
        return;
    }
    i++;
    std::cout << i << std::endl;
    ascend(n);
}

int main()
{
    ascend(20);

    return 0;
}

【讨论】:

  • 1.请不要用勺子喂食,它会鼓励提出不好的问题。 2. 你的功能是一次性的。尝试拨打ascend() 两次。
  • @Craig Young :这是我的错,我困了,并在函数体内声明了“i”,但是我认为我希望帮助提出一些实际代码的人并没有阻止他寻找更多信息和更好的方法。坏问题——总会有坏问题。没有人天生就拥有所有的知识。谢谢。 #KeepDownVote
  • 您的功能仍然是一次性的。你明白为什么它是一次性的吗?您根本无法使用无法正常工作的功能。与其抱怨应得的反对票(注意复数),不如尝试向他们学习。学习改进你的测试,这样你就可以编写更少的错误代码。从长远来看,这将使您成为更好的开发人员。
  • 重置i变量是合法的,它保留了原来的函数签名。
  • 太棒了!功能要求:修改任意全局变量使其正常工作。您的排序功能是否需要排序输入才能正常工作?
猜你喜欢
  • 2018-08-18
  • 2022-01-13
  • 2021-12-09
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多