matlab / octave中的递归sqrt(2)比率函数

时间:2017-12-11 18:50:22

标签: matlab recursion octave

我正在尝试在matlab / octave中创建一个递归的sqrt(2)比率函数。  我可以在电子表格中创建递归模式,查看数字以及在下面创建它们的相应公式。

Recursive numbers

Recursive formulas

我无法在matlab / octave中正常工作。 ab值应与上面的电子表格图片匹配。

function f = rtsqrt2(a,b,n)          
  for rr=1:n
    rr
    if (rr==1)
      ab_num(rr,:)=[a,b];

    elseif (rr==2)
      a=a+b+b;
      b=1+b;
      ab_num(rr,:)=[a,b];

    elseif 
      a=a+b+b;
      b=a+b;
      ab_num(rr,:)=[a,b];

    end
  end
  ab_num
end

当我做rtsqrt2(1,1,10)Error

前两行是正确的但在第三行 我得到的是7,9,而不是我应该得到的7,5,事情会变得更糟。如何修复它,以便我的递归函数遵循第一张图像中的模式。

请注意我使用的是octave 4,类似于matlab,我打算使用10次以上的递归(10次递归仅用于测试)

2 个答案:

答案 0 :(得分:0)

这是适合您描述的实现。请注意,计算(如您所述)是迭代的​​而不是递归的。

我在函数中包含了一些额外的位来制作和显示表格。

function x = rtsqrt2(a, b, n)
%% Compute the square root of 2 iteratively
%
% n = number of iterations
% a, b  are the initial values

%Initialise the vector A and B to hold the computation for each step
A = zeros(1, n);
A(1) = a;
B = zeros(1, n);
B(1) = b;
C = zeros(1, n);

% Compute the values of A and B iteratively
for k = 2 : n
    A(k) = A(k-1) + 2 * B(k-1);
    B(k) = A(k-1) + B(k-1);
end

% Compute the entire C vector (a/b) in a vectorised manner
C = A ./ B;
% Create a table to display the table like you'd see in excel
TBL = table(A', B', C');
TBL.Properties.VariableNames = {'A' 'B' 'C'};
disp(TBL)

% sqrt(2)
x = C(end);

这是运行的功能:

>>> rtsqrt2(1, 1, 10)
 A       B        C   
____    ____    ______

   1       1         1
   3       2       1.5
   7       5       1.4
  17      12    1.4167
  41      29    1.4138
  99      70    1.4143
 239     169    1.4142
 577     408    1.4142
1393     985    1.4142
3363    2378    1.4142


ans =

1.4142

答案 1 :(得分:0)

要让它在Octave 4.0中运行,这里有一些小的调整

function x = rtsqrt2(a, b, n) 
%% Compute the square root of 2 iteratively
%
% n = number of iterations
% a, b  are the initial values

%Initialise the vector A and B to hold the computation for each step
A = zeros(1, n);
A(1) = a;
B = zeros(1, n);
B(1) = b;
C = zeros(1, n);

% Compute the values of A and B iteratively
for k = 2 : n
    A(k) = A(k-1) + 2 * B(k-1);
    B(k) = A(k-1) + B(k-1);
end

% Compute the entire C vector (a/b) in a vectorised manner
C = A ./ B;
x=[A;B;C]';
%% Create a table to display the table like you'd see in excel
%TBL = table(A', B', C');
%TBL.Properties.VariableNames = {'A' 'B' 'C'};
%disp(TBL)

% sqrt(2)
%x = C(end);

end