簡體   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