因此,对于我的一项家庭作业,我们被要求创建一个hailstonesequence并且我完全卡住了。我很难弄清楚如何分解包含循环的函数段,然后尝试将其转换为递归函数。任何帮助将不胜感激。在下面我有原始的for-loop函数,然后是(Attempted)递归函数。
// startingValue function with For-Loop
// Takes in an int value n and returns the
// start value k from 1 to n, that has the longest length.
int startingValue (int n) {
int length = 0;
int k;
for ( int i = 1; i <= n; i++ ) {
int currentLength = largestHailstoneLength(i);
if (currentLength > length) {
length = currentLength;
k = i;
}
}
return k;
}
这是我尝试上述函数的递归版本:
int startingValue (int n) {
int length = 0;
int n = 0;
int currentLength = largestHailstoneLength(i);
if (currentLength < length) {
return 0;
} else {
length = currentLength;
n = i;
}
return (startingValue(i));
}
答案 0 :(得分:0)
这里有一些简单的,可能效率低下的东西应该让你开始:
int startingValue(int n) {
if (n == 1) {
return n;
}
int m = startingValue(n - 1);
return largestHailstoneLength(n) > largestHailstoneLength(m) ? n : m;
}
答案 1 :(得分:0)
我不打算做你的作业,但我会告诉你Ruby中的解决方案是什么样的,这种语言与伪代码一样可读。 #
之后的任何内容都是评论。
# Ruby equivalent to your C++ loop version
def start(n)
biggest = 0
k = -1
(1..n).each do |i| # loop from 1 to n, inclusive...
# don't have access to your largestHailstoneLength(i) function,
# so I'm using a random number on the range [0,1000)
current = rand(1000)
biggest, k = current, i if current > biggest
end
return k
end
# Using default argument values. Alternatively, you can build
# a single-argument front end function and a recursive back end
# with these args the state info.
def start_recursive(n, i = 1, biggest = 0, k = -1)
current = rand(1000) # same as above
biggest, k = current, i if current > biggest
return i < n ? start_recursive(n, i + 1, biggest, k) : k
end
srand 12345 # explicit seed to RNG for reproducibility of sequence
p start(1000) # => 301
srand 12345 # reseed RNG sequence to show recursive version yields same result
p start_recursive(1000) # => 301
在考虑了一点,并且玩了更大的范围之后,我想出了以下变体,它不太可能遭受堆栈溢出 - 它使用分而治之的策略来划分候选范围。我还通过调用largestHailstoneLength(i)
来替换随机数评估:
def start_recursive(upper_index, lower_index = 1)
return lower_index if lower_index >= upper_index
mid = (lower_index + upper_index) / 2
lower_max = start_recursive(mid, lower_index)
upper_max = start_recursive(upper_index, mid + 1)
if largestHailstoneLength(lower_max) < largestHailstoneLength(upper_max)
return upper_max
else
return lower_max
end
end
答案 2 :(得分:0)
您的代码中存在一些问题
>>> a=[1,4,5,2]
>>> b=[4,3,1,5]
>>> sorted(b, key=lambda x:a.index(x) if x in a else len(a))
[1, 4, 5, 3]
如果我做对了,i
应该返回startingValue()
最大的值。
所以我们这里遵循的是归纳原则:
largestHailstoneLength()
个值n
为n
,我不必进行任何比较,只需返回1
。否则
n
最大,则应该大于n
和1
之间的最大值。n - 1
和1
之间的最大值。n - 1
最大,则应该大于n - 1
和1
之间的最大值那么,最重要的是检查n - 2
n
我们在递归中需要做的是将当前 // Stop here, no need to go compare
if (n == 1) return n;
与从n
到1
的最大值进行比较。那就是:
n - 1
知道哪个是更大的,我们只需返回它。
为了更好地理解事物,请多读一点。您可以开始here。