好吧,我一直试图重做这么多次。虽然,有一次我认为最长的序列函数会有所帮助,因为它显示了最长的冰雹序列。虽然,我似乎无法弄清楚如何找到或存储它用于找到它的价值。如果有人可以解释如何,我会很感激。
int longestSequence(int n)
{
int u = n;
if(u == 1)
{
return 1;
}
else
{
return max(hailstoneLength(u), longestSequence(u-1));
}
}
我遇到麻烦的部分是我最长的开始序列:
int hailLongestSeq(int n)
{
int k;
int longest = 0;
for(int j = 1; j <= n; j++)
{
if(hailstoneLength(j) > longest)
{
longest = hailstoneLength(j);
k = j;
}
}
return k;
}
我不确定如何将其变为递归,我注意到一些递归我看到人们仍然使用for循环,但我确信我们不应该使用循环。 这可能是一个愚蠢的问题,但如果有人知道,那么是否存在将循环转换为递归的公式?
预期的出局是这样的:
从最长10的数字开始的最长的冰雹序列长度为20。 从最长10开始的最长的冰雹序列从9开始。
因为9的序列长度为20个数字,并且从1到10最长。
答案 0 :(得分:3)
是的每个for循环都可以转换为递归调用,显然是这样的:
for (i=0; i<N; i++) {
body;
}
将其翻译为:
func(int i) {
if (i<N) { body; func(i+1) }
else return;
}
func(0);
这可以很容易地扩展到任何for循环计算(如果需要,可以添加参数,返回值等)。
答案 1 :(得分:0)
您可以在函数的参数签名中添加要保留的本地变量值。我试图将代码重写为递归。检查并确认这是否可以解决您的问题。
int hailLongestSeq(int n, int j, int k, int longest)
{
if(j <= n)
{
if(hailstoneLength(j) > longest)
{
longest = hailstoneLength(j);
k = j;
}
k = hailLongestSeq(n, ++j, k, longest);
}
return k;
}
这可能需要修复,但逻辑保持不变,将变量作为参数传递以保留值。