如何使用迭代编写此算法?

时间:2018-08-30 22:10:16

标签: recursion iteration

如何使用迭代编写此算法?

function generate(num1:byval) 
     if num1 > 10 then 
          return 10 
     else 
          return num1 + (generate(num1 + 1) DIV 2) 
     endif 
endfunction

2 个答案:

答案 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;
}