MATLAB 递归帕斯卡三角形

问题描述

我正在学习递归函数。我希望能够输出帕斯卡三角形的行向量“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