【问题标题】:Converting an iterative algorithm to a recursive one [closed]将迭代算法转换为递归算法[关闭]
【发布时间】:2015-01-11 21:03:08
【问题描述】:

我编写了以下程序:

#include <stdio.h>

void printValue();

int main (){
   int n = 100;
   int i;
   for (i=0; i<n; i+=1)
          printValue();
}


void printValue(){
     static unsigned int y = 0;
     printf("y = %d", y);
     y+=1;
}

如何重写算法以使其递归?

【问题讨论】:

  • 请尝试自己编写递归版本。你通过做来学习编程,而不是让别人为你做。如果您无法让它正常工作,请回来,我们会帮助您了解哪里出了问题。
  • 好的,是的,barmar 是对的。所以我不会写递归的。只需搜索和学习。
  • 不要一直分配 y=0....
  • 你知道这是他的第一个问题吗?

标签: c algorithm recursion


【解决方案1】:
#include <stdio.h>

void printValue(void);
void times(int n, void (*func)(void)){
    if(n>0){
        func();
        times(--n, func);
    }
}

int main (void){
    int n = 100;
    times(n, printValue);
    return 0;
}

void printValue(void){
    static unsigned int y = 0;
    printf("y = %d\n", y);
    y+=1;
}

#include <stdio.h>

void printValue(int);
void repeat_upto(int init_value, int end_value, int incremental,
                 void (*func)(int)){
    if(incremental < 0 ? init_value >= end_value : init_value <= end_value){
        func(init_value);
        repeat_upto(init_value + incremental, end_value, incremental, func);
    }
}

int main (void){
    repeat_upto(0, 100-1, +1, printValue);
    return 0;
}

void printValue(int v){
    printf("%d\n", v);
}

#include <stdio.h>

void printValue(int v, int end_value){
    if(v < end_value){
        printf("%d\n", v);
        printValue(v+1, end_value);
    }
}

int main (void){
    printValue(0, 100);
    return 0;
}

【讨论】:

  • 大声笑,比我在这个问题上看到的预期要好得多......我正计划对所有无法阻止自己回答的人投反对票......
  • @mathlearner 1) 我重写了代码中的迭代部分是 for 循环的一部分。
  • 2-1) 在cmets中已经说过y不会自增,但是为什么呢?y+1中的运算结果没有保存。
  • 2-2) 我认为其他人的回答会有所帮助。如果代码错误,您将对其进行修改以正确考虑错误。
  • @mathlearner 它应该像你的代码一样递增,y = 0 是不必要的,但y 的值不会在每次调用函数时设置为0,评论者错了。
【解决方案2】:

这与 BLUEPIXY 的答案几乎相同,因为我认为这是直接的解决方案,但由于您对函数指针感到困惑,因此我将其删除。

#include <stdio.h>
#include <stdlib.h>

void
printValue()
{
    static unsigned int y;
    printf("%d\n", y);
    y += 1;
}

void
recursiveFunction(int counter)
{
    printValue();
    if (--counter == 0)
        return;
    recursiveFunction(counter);
}

int
main()
{
    recursiveFunction(100);
    return 0;
}

或者你的意思是这个

#include <stdio.h>
#include <stdlib.h>

void
printValue(int y)
{
    if (++y > 100)
        return;
    printf("%d\n", y);
    printValue(y);
}

int
main()
{
    printValue(0);
    return 0;
}

【讨论】:

  • 这意味着算法是通用的,通过这种方法您可以传递任何函数指针,因此您可以从递归函数中执行您想要的任何函数。
  • 你说的auxiliary function是什么意思?因为它是一个递归函数,或者你的意思是如果你可以打印递归函数本身的值,答案是肯定的。
  • @mathlearner 好吧,在最后一个程序中,recursive function 和您可能会说实际执行某些操作的函数都是相同的,如果这就是您的意思 auxiliary function
  • 在第一个程序中有一个递归函数,recursiveFunction(int counter) 它检查给定的条件,如果不满足它将调用自己,否则它将终止。在该函数中,我们调用printValue() 函数,因此我们做一些有趣的事情。在第二种情况下,做一些有趣的事情的函数本身就是递归函数,因为除非满足条件,否则它将一遍又一遍地调用自己。
  • 这取决于有什么要求。
【解决方案3】:

代替

void printValue()
{
    static unsigned int y = 0;
    printf("y = %d", y);
    y+1;
}

我把它变成:

void printValue(int y)
{
    y++;
    printf("y = %d\n", y);
    printValue(y);
}

已编译 -> His function

已编译 -> Recursive function

看到相同的输出,我只是做了 OP 想要的。

个人我会这样做没有递归函数避免无限循环:

for (i=0; i<n; i++)
{
      printValue(y);
}

void printValue(int y){
     printf("y = %d\n", y);
}

【讨论】:

  • 来吧,你做了一件疯狂的事情.. :)) 你如何停止递归,你不能这样做!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 2011-11-30
  • 2011-06-13
  • 1970-01-01
相关资源
最近更新 更多