[英]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...)
}
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.