问题描述
我正在学习递归函数。我希望能够输出帕斯卡三角形的行向量“n”。 k 是该行的元素。例如,n = 3,行 = 1 2 1。
到目前为止我已经尝试过这个,但没有成功。我得到的错误是我需要在 n > 2 时定义 PT。我已经查看了有关堆栈溢出的其他问题,但是它们都没有在 MATLAB 中显示递归函数。我尝试在 n > 2 时使用 for 循环,但这似乎也不起作用。
function row = PT(n,k)
if n==1
k = 1;
PT(n,k) = 1;
row = [1];
elseif n==2
if k == 1
PT(n,k) = 1;
else k == 2
PT(n,k) = 1;
end
row = [1 1];
else n > 2;
PT(1,1) = [1];
PT(2,2) = [1];
row = [PT(2,1),PT(2,2)];
row = [PT(n-1,k-1)+ PT(n-1,k)];
end
end
解决方法
帕斯卡三角不是经典的递归问题,可以很容易地在循环中解决:
function row = PT(n)
row = 1;
for z = 2:n
row = [row(1),movsum(row,2,'Endpoints','discard'),row(end)];
end
end
当然,您可以将每个循环转换为递归:
function row = PT(n)
row = recursiveHelper(1,n);
end
function row = recursiveHelper(row,n)
if n == 1
return;
end
row = recursiveHelper([row(1),row(end)],n - 1);
end
递归函数调用自身。在这种情况下,recursiveHelper
从当前行计算下一行,递减 n
并调用自身,直到 n
达到 1
。
两个函数产生相同的输出:
>> PT(1)
ans = 1
>> PT(2)
ans = 1 1
>> PT(3)
ans = 1 2 1
>> PT(4)
ans = 1 3 3 1
>> PT(5)
ans = 1 4 6 4 1
,
在这上面花了更多时间之后,我添加了一个 for 循环是正确的,但我的函数命名错误。
以下是改进后的代码:
function [out] = mypascalrow(n)
% The first row is a 1,and the second is 1 1.
PT(1,1) = 1;
PT(2,1) = [1 1];
PT(2,2) = [1 1];
% first if statement is establishing the first 2 rows
if n == 1
out = [1];
elseif n == 2
out = [1 1];
end
for i = 3:n
PT(i,1) = 1; % starting with a 1
for k = 2:i-1
PT(i,k) = PT(i-1,k-1) + PT(i-1,k);
end
PT(i,i) = 1; % ending with a 1
end
out = PT(n,:);
end
测试结果:
>> [out] = mypascalrow(7)
out =
1 6 15 20 15 6 1