C 如何更改代码,创建递归函数

C 如何更改代码,创建递归函数,c,function,recursion,cs50,C,Function,Recursion,Cs50,我参加了一个叫做CS50的课程。我最近一直在学习递归函数,尽管我创建了一个名为Collatz的程序,它完成了我希望它做的事情,但它内部没有递归函数,因为函数本身不调用。我被卡住了,我想不出,我应该如何实现一个递归函数,使它看起来整洁干净,并且可以自己调用 我尝试在我的主函数之外实现一个函数。但我不知道这个函数应该是什么样子,它如何调用自己 //int x(int n); int main(void) { int n; //j is a counter for the numbe

我参加了一个叫做CS50的课程。我最近一直在学习递归函数,尽管我创建了一个名为Collatz的程序,它完成了我希望它做的事情,但它内部没有递归函数,因为函数本身不调用。我被卡住了,我想不出,我应该如何实现一个递归函数,使它看起来整洁干净,并且可以自己调用

我尝试在我的主函数之外实现一个函数。但我不知道这个函数应该是什么样子,它如何调用自己

//int x(int n);

int main(void)
{
    int n;
    //j is a counter for the number of times 'n' has to be calculated to get n==1
    int j = 0;

    //Ask for an integer
    printf("Int: ");
    scanf("%i", &n);

    //Check for 0 or less
    if (n <= 0)
    {
        printf("ERROR.")
        return 1;
    }

    //This is where recursion should be implemented
    while (n != 1)
    {
        if (n % 2 != 0)
        {
            while ((n % 2) != 0)
            {
                n = 3*n + 1 ;
                j++;
            }
        }
        else if ((n % 2) == 0)
        {
            while (n != 1)
            {
                n /= 2;
                j++;
            }
        }
    }
    printf("N: %i, number of times: %i \n", n,j);
}

/*
int x(int n)
{
    Should a recursive function be implemented here?
}
*/
//int x(int n);
内部主(空)
{
int n;
//j是一个计数器,用于计算“n”的次数,以获得n==1
int j=0;
//要求一个整数
printf(“Int:”);
scanf(“%i”和“&n”);
//检查0或更少

如果(n对于类似的东西,我建议使用一个递归函数,该函数的return是使n等于1所需的时间数,因为这是您真正想要跟踪的。因为您尝试进行递归的代码是一个循环,这使得查找基本情况(或退出条件)相对容易在这种情况下,当n==1时,我们就有了这样的线索

int recursive_function(int n) {
    if (n == 1) {
        return 0;
    }
}
现在我们需要关注逻辑,以便跟踪函数运行的次数(本质上是j),我们应该让函数返回它运行的次数,这样会更容易跟踪。为此,我们将向函数添加另一个return语句,并使其再次运行,因为我们已经设置了退出条件,告诉我们何时停止。之后,您只需添加逻辑,但我们应该我想出了这样的办法:

int recursive_function(int n) {
    if (n == 1) {
        return 0;
    } else if (n % 2 != 0 ) {
        n = 3 * n + 1 ;
    } else if (n % 2 == 0) {
        n /= 2;
    }
    return 1 + recursive_function(n);
}
int x(int n)
{
  if (n == 0)
    return 1;
  else
    return x(n);
}

对于类似的情况,我建议使用一个递归函数,它的return是使n等于1所需的时间数,因为这是您真正想要跟踪的所有内容。因为您尝试进行递归的代码是一个循环,这使得查找基本情况(或退出条件)相对容易在这种情况下,当n==1时,我们就有了这样的线索

int recursive_function(int n) {
    if (n == 1) {
        return 0;
    }
}
现在我们需要关注逻辑,以便跟踪函数运行的次数(本质上是j),我们应该让函数返回它运行的次数,这样会更容易跟踪。为此,我们将向函数添加另一个return语句,并使其再次运行,因为我们已经设置了退出条件,告诉我们何时停止。之后,您只需添加逻辑,但我们应该我想出了这样的办法:

int recursive_function(int n) {
    if (n == 1) {
        return 0;
    } else if (n % 2 != 0 ) {
        n = 3 * n + 1 ;
    } else if (n % 2 == 0) {
        n /= 2;
    }
    return 1 + recursive_function(n);
}
int x(int n)
{
  if (n == 0)
    return 1;
  else
    return x(n);
}

因为你不知道递归函数是什么样子,也不知道它应该如何调用自己,这里有一个简单的例子

int事实(int n)
{
如果(n==0)//这是停止情况
返回1;
其他的
返回n*fact(n-1));//这就是函数递归的原因
}
在本例中,我们正在计算一个数字的阶乘。我们需要有一个分支,以便在我们知道何时应该停止调用该函数时使用。基本上,此递归函数与以下相同:

for(int i=0;i
让函数递归意味着它摆脱了循环。我建议您从最外层的while循环开始,并确定如何通过在代码的各个部分实现一些返回函数来消除循环,从而使其递归。作为提示,您应该有以下
if
语句:

如果(n!=1)
return/*任何适合停止情况的值都应该是整数*/
对于递归函数,另一个需要注意的重要事项是:当您进行函数调用时,输入需要更改。我的意思是,您不应该有这样的函数:

int recursive_function(int n) {
    if (n == 1) {
        return 0;
    } else if (n % 2 != 0 ) {
        n = 3 * n + 1 ;
    } else if (n % 2 == 0) {
        n /= 2;
    }
    return 1 + recursive_function(n);
}
int x(int n)
{
  if (n == 0)
    return 1;
  else
    return x(n);
}
输入相同的数字,但没有返回x(n-1)
之类的内容,将创建一个无限循环,因为除非输入的原始数字到达停止案例,否则无法到达停止案例

当然,您也可以在递归调用中添加更多的计算,并编写类似于
return 7*x(n)/2;
的内容。许多初学者在学习递归函数时往往忘记了这一点,只想为他们的return语句编写类似于
return x(n-2);
的内容

在您的例子中,如果(n==1)
,则“停止案例”应该是


希望这足以让您开始学习!

好吧,因为您不知道递归函数是什么样子,也不知道它应该如何调用自己,下面是一个简单的示例

int事实(int n)
{
如果(n==0)//这是停止情况
返回1;
其他的
返回n*fact(n-1));//这就是函数递归的原因
}
在本例中,我们正在计算一个数字的阶乘。我们需要有一个分支,以便在我们知道何时应该停止调用该函数时使用。基本上,此递归函数与以下相同:

for(int i=0;i
让函数递归意味着它摆脱了循环。我建议您从最外层的while循环开始,并确定如何通过在代码的各个部分实现一些返回函数来消除循环,从而使其递归。作为提示,您应该有以下
if
语句:

如果(n!=1)
return/*任何适合停止情况的值都应该是整数*/
对于递归函数,另一个需要注意的重要事项是:当您进行函数调用时,输入需要更改。我的意思是,您不应该有这样的函数:

int recursive_function(int n) {
    if (n == 1) {
        return 0;
    } else if (n % 2 != 0 ) {
        n = 3 * n + 1 ;
    } else if (n % 2 == 0) {
        n /= 2;
    }
    return 1 + recursive_function(n);
}
int x(int n)
{
  if (n == 0)
    return 1;
  else
    return x(n);
}
输入相同的号码,但没有返回x(n-1)
之类的内容,将创建一个