我试图在冰雹序列中找到最大的数字,但我对递归是相当新的。这段代码适用于某些数字,但对于像27或678这样的数字,它会冻结,而且我花了很多时间试图找出原因。
int next(int n)
{
if(n != 1)
{
if(n % 2 == 0)
{
return n/2;
}
else
{
return (n*3)+1;
}
}
return n;
}
int haillargest(int begin)
{
int nhail = next(begin);
if(begin == 1)
{
return begin;
}
else if(haillargest(nhail) > begin)
{
return haillargest(nhail);
}
else
{
return begin;
}
}
我使用递归错误吗?
答案 0 :(得分:0)
你在 haillargest 中弄错了支票并返回了值。当我清理演示文稿时它消失了:
#include <stdio.h>
#include <stdlib.h>
int next(int n)
{
if(n == 1) return n;
if(n % 2 == 0) return n/2;
return (n*3)+1;
}
int haillargest(int begin)
{
static nest = 0;
int nhail = next(begin);
int result, new_num;
// printf("Enter %d %d %d\n", nest++, begin, nhail);
if (begin == 1)
result = 1;
else {
new_num = haillargest(nhail);
if (new_num > begin)
result = new_num;
else
result = begin;
}
// printf("Leave %d %d\n", --nest, result);
return result;
}
main() {
printf("%d %d\n", 27, haillargest(27));
printf("%d %d\n", 678, haillargest(678));
}
输出:
27 9232
678 4372
答案 1 :(得分:0)
您可以将当前“largestSoFar”号码传递给该函数的下一次迭代,并将其与下一个数字进行比较。
$image