如何使用迭代编写此算法?
function generate(num1:byval)
if num1 > 10 then
return 10
else
return num1 + (generate(num1 + 1) DIV 2)
endif
endfunction
答案 0 :(得分:1)
所以这不是直接的,所以我先做一些艰苦的工作:
n result
11.. 10
10 10
9 9 + 10/2
8 8 + (9 + 10/2)/2
7 7 + (8 + (9 + 10/2)/2)/2
这看起来像是一种模式。当递归版本从输入端开始并向上移动时,很容易看出,从10开始并向下移动,可以通过将值减半并加上当前值来简单地更新累加器。 / p>
可以使用帮助程序轻松实现:
procedure generate(num : integer) : integer
begin
generate := generateHelper(10, num, 0)
end
procedure generateHelper(cur : integer, num: integer, acc : integer) : integer
begin
if cur = num then
generateHelper := cur + acc/2;
else
generateHelper := generateHelper(cur - 1, num, acc/2 + cur);
end
或使用循环:
procedure generate(num : integer) : integer
var cur, acc : integer;
begin
for cur := 10 downto cur do
acc := acc / 2 + cur;
generate := acc;
end
答案 1 :(得分:1)
如果您为函数计算出一些值……
f(10) = 10
f(9) = 9+f(10)/2 = 9+10/2 = 14
f(8) = 8+f(9)/2 = 8+14/2 = 15
…
您会感觉到可以重复将相同的公式应用于循环中的值。您会看到是否从10开始,先除以2加9,然后再除以2加8,然后一直进行下去,直到达到给定函数的数字为止。看起来像这样,例如在JavaScript中:
function generate(n) {
let x = 10;
for(let i = 10; i > n; i--) {
x = i - 1 + x / 2;
}
return x;
}