给出样本模式,
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);
以打印剩余序列。但我不知道如何在没有任何变量或循环的情况下做到这一点。有没有可用的算法或任何其他更好的解决方案。
答案 0 :(得分:9)
我的评论的一些示例代码,如果不必严格左移或右递归则匹配:
void sequence(int n)
{
printf("%d ", n);
if (n > 0)
{
sequence(n-5);
printf("%d ", n);
}
}
补充说明:
1。)这似乎是关于函数式编程,其中一个关键概念是你永远不能分配一个变量......看看它是如何在这里避免的。 (严格地说,由于printf
副作用,它不起作用)
2。)它不是严格的左递归或右递归(意味着递归发生在评估的中间),因此它不能轻易转换为迭代的东西。
答案 1 :(得分:2)
似乎递归应该在达到0
或更低时停止。所以在递归函数中尝试这个条件(简化为只有一个参数):
void sequence(input) {
// print input
if (input > 0) {
// recursive call
sequence(input);
}
// print input again (sometimes...)
}
为了对称,也可以使用reverse version的Felix's solution
void sequence(int n)
{
if (n > 0) {
printf("%d ", n);
sequence(n-5);
}
printf("%d ", n);
}
两者都具有一种似乎不符合问题的回文结构的不对称性,还有另一个问题:尾随空间的瑕疵。因此,让我们向您介绍一个处理这些微小(?)缺陷的obvious solution:
void sequence(int n)
{
if (n > 0) {
printf("%d ", n); sequence(n-5); printf(" %d", n);
} else {
printf("%d", n);
}
}
答案 2 :(得分:0)
使用两种不同的功能来上下左右:
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
开始计算。
答案 3 :(得分: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);
}