PTA 习题2.6 递归求简单交错幂级数的部分和 习题3.3 线性表元素的区间删除 习题3.5 求链表的倒数第m个元素

习题2.6 递归求简单交错幂级数的部分和
题目要求:
本题要求实现一个函数,计算下列简单交错幂级数的部分和。
接口:double fn( double x, int n );
其中题目保证传入的n是正整数,并且输入输出都在双精度范围内。函数fn应返回上述级数的部分和。建议尝试用递归实现。
代码:

double fn( double x, int n ){
	if(n==1)  return x;
	else return x*(1-fn(x,n-1));
} 

解题思路:
借鉴了大神的思路,总结一下就是:第n阶乘上-x就是第n+1阶中除了第一项以外的内容,此时还需要加一个x放到n+1阶的头部,这样就构成了完整的n+1阶式子。所以将x提取出来乘上(1-fn)。递归下去就行。

习题3.3 线性表元素的区间删除
题目要求:
给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素。删除后表中剩余元素保持顺序存储,并且相对位置不能改变。
接口:List Delete( List L, ElementType minD, ElementType maxD );
L是用户传入的一个线性表,其中ElementType元素可以通过>、==、<进行比较;minD和maxD分别为待删除元素的值域的下、上界。函数Delete应将Data[]中所有值大于minD而且小于maxD的元素删除,同时保证表中剩余元素保持顺序存储,并且相对位置不变,最后返回删除后的表。
代码:

List Delete( List L, ElementType minD, ElementType maxD ){
	int p=0;
	int i;
	for(i=0;i<=L->Last;i++){
		if(L->Data[i]<=minD || L->Data[i]>=maxD){
			L->Data[p]=L->Data[i];
			p++;
		}
	}
	L->Last=p-1;
	return L;
}

本题思路:
1、在原表的基础上覆盖成新表,用p来指向新表的各项,判定如果data小于等于左边界,或者大于等于右边界,则将原值赋给p现在所指的那一项。
2、需要注意代码中的几个等号,尤其是for中for(i=0;i<=L->Last;i++)必须要加等号,因为遍历的时候i要走完全程,如果只有<则最后一项没有被遍历到。(这里的Last是从0开始查的位置。)

习题3.5 求链表的倒数第m个元素
题目要求:
请设计时间和空间上都尽可能高效的算法,在不改变链表的前提下,求链式存储的线性表的倒数第m(>0)个元素。
接口:ElementType Find( List L, int m );
L是给定的带头结点的单链表;函数Find要将L的倒数第m个元素返回,并不改变原链表。如果这样的元素不存在,则返回一个错误标志ERROR。
代码:

ElementType Find( List L, int m ){
	List p=L->Next;
	int count=0;
	int num[100000];
	while(p!=NULL){
		num[count]=p->Data;
        count++;
		p=p->Next;
	}
	if(m>count || m<0) return ERROR;
	else return num[count-m];
}

本题思路:
1、最开始用了两次遍历,时长过长。之后改用数组储存数据。
2、注意好数组的角标怎么处理,有一点需要注意:当时我卡在这句话很久else return num[count-m],总觉得应该写成else return num[count-m+1],后来看到了因为是p不为空时退出循环。所以count是多加了一个1的所以直接count-m即为所找位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值