【发布时间】:2019-07-16 15:24:51
【问题描述】:
我参加了一门名为 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?
}
*/
输出正常。 输出应该是数字 n,它应该始终为 1,因此要证明程序有效并始终到达数字 1,以及从 n 到 1 需要多少步。
【问题讨论】:
-
提示:将循环转换为递归有时会非常棘手。采用 Collatz 问题的原始公式并将其直接写为递归要简单得多。这要简单得多。
-
其他提示:为了熟悉递归,把阶乘函数写成递归函数。
-
提示:您的代码中真的需要内部
while循环吗?