繁体   English   中英

使用C - 算法按顺序打印数字

[英]Printing a number in sequence using C - Algorithm

给出样本模式,

input :    16
output:    16 11 6 1 -4 1 6 11 16

如果输入为10,则程序应将输出打印为

10 5 0 5 10

注意:上述序列递减/递增5。

挑战是不要声明任何变量或循环。 仅使用递归。

我尝试过以下代码。

void sequence(int input, int base){

    input = input - (input > 0?5:-5); //main execution
    printf("input:%d\n",input);
    if(input == base)return;
    sequence(input,base);
}

//例如。 输入和基数(初始值)为16.上述方法递归直到input = base。

我可以打印到这个序列(粗体)

16 11 6 1 -4 1 6 11 16

如何完成序列。 在上面的方法中,在主执行行中,我需要检查条件为input = input - (input < 0?5:-5); 打印剩余的序列。 但我不知道如何在没有任何变量或循环的情况下做到这一点。 有没有可用的算法或任何其他更好的解决方案。

我的评论的一些示例代码,如果它不必严格左或右递归,它将匹配:

void sequence(int n)
{
    printf("%d ", n);
    if (n > 0)
    {
        sequence(n-5);
        printf("%d ", n);
    }
}

附加说明:

1.)这似乎是关于函数式编程 ,其中一个关键概念是你永远不能分配一个变量......看看它是如何避免的。 (严格来说,由于printf副作用,它不起作用)

2.)它不是严格的左递归或右递归(意味着递归发生评估的中间 ),因此它不能轻易转换为迭代的东西。

似乎递归应该在达到0或更低时停止。 所以在递归函数中尝试这个条件(简化为只有一个参数):

void sequence(input) {
    // print input
    if (input > 0) {
        // recursive call
        sequence(input);
    }
    // print input again (sometimes...)
}

更新:我们来谈谈Symmetry

为了对称,也可以使用Felix解决方案反向版本

void sequence(int n)
{
    if (n > 0) {
        printf("%d ", n);
        sequence(n-5);
    }
    printf("%d ", n);
}

两者都具有一种似乎不适合问题的回文结构的不对称性,还有另一个问题:尾随空间的瑕疵。 那么让我们向您介绍一个处理这些微小(?)缺陷的明显解决方案

void sequence(int n)
{
    if (n > 0) {
        printf("%d ", n); sequence(n-5); printf(" %d", n);
    } else {
        printf("%d", n);
    }
}

使用两种不同的功能来上下左右:

void down(int input, int base) {
    printf("input:%d\n",input);
    if(input > 0) down(input - 5, base);
    else up(input + 5, base);
}

void up(int input, int base) {
    printf("input:%d\n",input);
    if(input == base) return;
    up(input + 5, base);
}

通过调用开始计算down

现场演示

#include <stdio.h>

using namespace std;

void printSequence(int input) {
    printf("%d ", input);
    if (input <= 0)
        return;
    printSequence(input - 5);
    printf("%d ", input);
}

int main ()
{
    int input = 0;
    scanf("%d", &input);

    printSequence(input);

    return 0;
}

你的递归代码的base case似乎是错误的。 我认为你的代码按照它的方式进入无限递归。 您可以使用标志来实现您的序列:

void sequence(int input, int base){
    static int flag = 0;
    //input = input - (input > 0?5:-5); //main execution, wrong
    printf("input:%d\n",input);
    input -= (flag == 0)?5:-5;          //use flag for base case of sequence
    if(input <= 0)
        flag = 1;
    if(input == base){
        printf("input:%d\n",input);
        return;
    }
    sequence(input,base);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM