pascal 如何用递归做1+1/3+1/5+……+1/2n-1
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pascal 如何用递归做1+1/3+1/5+……+1/2n-1相关的知识,希望对你有一定的参考价值。
我做的程序如下,为什么到3以后就运行不了?
program a1;
var
x:integer;
y:real;
function func(n:integer):real;
var
i:integer;
begin
if 2*n-1=1 then func:=1
else func:=1/(2*n-1)+func(2*(n-1)-1);
end;
begin
readln(x);
y:=func(x);
writeln(y:3:6);
end.
例题:
给你一个数字三角形, 形式如下:
1
2 3
4 5 6
7 8 9 10
找出从第一层到最后一层的一条路,使得所经过的权值之和最小或者最大.
无论对与新手还是老手,这都是再熟悉不过的题了,很容易地,我们写出状态转移方程:f(i, j)=a[i, j] + min
对于动态规划算法解决这个问题,我们根据状态转移方程和状态转移方向,比较容易地写出动态规划的循环表示方法。但是,当状态和转移非常复杂的时候,也许写出循环式的动态规划就不是那么简单了。
解决方法:
我们尝试从正面的思路去分析问题,如上例,不难得出一个非常简单的递归过程 :
f1:=f(i-1,j+1); f2:=f(i-1,j);
if f1>f2 then f:=f1+a[i,j] else f:=f2+a[i,j];
显而易见,这个算法就是最简单的搜索算法。时间复杂度为2n,明显是会超时的。分析一下搜索的过程,实际上,很多调用都是不必要的,也就是把产生过的最优状态,又产生了一次。为了避免浪费,很显然,我们存放一个opt数组:Opt[i, j] - 每产生一个f(i, j),将f(i, j)的值放入opt中,以后再次调用到f(i, j)的时候,直接从opt[i, j]来取就可以了。于是动态规划的状态转移方程被直观地表示出来了,这样节省了思维的难度,减少了编程的技巧,而运行时间只是相差常数的复杂度,避免了动态规划状态转移先后的问题,而且在相当多的情况下,递归算法能更好地避免浪费,在比赛中是非常实用的.
如何用hive实现cte递归关联
declare @carid int set @carid=1; with carparts(subpart,qty,lvl)--lvl为循环的次数 as (select subpart,qty,0 from tblcarparts where part=N'车身'and car_id=@carid--第一个CTE结果集 union all select tblcarparts.subpart,carparts.qty*t. 参考技术A 说的是hive,你写的是sqlserver吧以上是关于pascal 如何用递归做1+1/3+1/5+……+1/2n-1的主要内容,如果未能解决你的问题,请参考以下文章