求解答matlab问题输入一个正整数n,n作为初始数据,反复计算,知道1 为止如果n为偶数,则这一位上为n/2如果n为奇数,则这一位上为3*n+1例如 :n =17,生成一个数列52→26→13→40→20→10→5→16→8→4→

来源:学生作业帮助网 编辑:作业帮 时间:2022/05/27 20:40:20
求解答matlab问题输入一个正整数n,n作为初始数据,反复计算,知道1 为止如果n为偶数,则这一位上为n/2如果n为奇数,则这一位上为3*n+1例如 :n =17,生成一个数列52→26→13→40→20→10→5→16→8→4→

求解答matlab问题输入一个正整数n,n作为初始数据,反复计算,知道1 为止如果n为偶数,则这一位上为n/2如果n为奇数,则这一位上为3*n+1例如 :n =17,生成一个数列52→26→13→40→20→10→5→16→8→4→
求解答matlab问题
输入一个正整数n,n作为初始数据,反复计算,知道1 为止
如果n为偶数,则这一位上为n/2
如果n为奇数,则这一位上为3*n+1
例如 :n =17,生成一个数列
52→26→13→40→20→10→5→16→8→4→2→1
考虑所有第一个数小于等于n的数列
1.求不同初始值,生成数组的长度
2.最大数组长度和他对应的初始值
3.出现频率最高的数组长度和次数
4.长度是18的数列的个数
N的区间设置成11248-11348

求解答matlab问题输入一个正整数n,n作为初始数据,反复计算,知道1 为止如果n为偶数,则这一位上为n/2如果n为奇数,则这一位上为3*n+1例如 :n =17,生成一个数列52→26→13→40→20→10→5→16→8→4→

参考代码

可使用我之前在另一个问题计算单个n对应数列长度的函数len_series来处理:

N = 11248:11348;
L = N*0;
for i=1:length(N)
    n=N(i);
    L(i) = len_series(n);
end

% 1.求不同初始值,生成数组的长度
clf
plot(N,L,'.-')
xlim([min(N) max(N)])
xlabel('初始值');
ylabel('数组长度');

% 2.最大数组长度和他对应的初始值
[Lmax,inx] = max(L)
Nmax = N(inx);
hold on
plot(Nmax,Lmax,'rp')
text(Nmax,Lmax,sprintf('(%i,%i)',Nmax,Lmax))
disp(N(L==Lmax))

% 3.出现频率最高的数组长度和次数
V=unique(L);
F=arrayfun(@(v)sum(L==v),V);
figure
bar(V,F)
[Fmax,inx] = max(F);
disp([V(inx) Fmax])
xlabel('数组长度');
ylabel('出现次数');

% 4.长度是18的数列的个数
L18 = sum(L==18)

 

结果及说明

1、不同初始值对应的生成数组长度如图所示

2、最大数组长度为206,对应的初始值有5个,分别是:11263,11273,11289,11346,11347

 

3、出现频率最高的数组长度是87,共出现24次.各种长度的出现次数如图:

4、不存在长度是18的数列.在此区间内,数列长度最小为25.

 

附:函数len_series代码(稍有改动)

function len = len_series(n)
A = n;
while abs(n-1) > eps
    if ~rem(n,2)
        n = n/2;
    else
        n = n*3+1;
    end
    A(end+1) = n;
end
fprintf('%i → ',A(1:end-1));
fprintf('%i\n',A(end));
len = length(A);