程序设计习题 第 6 章 重复用
6.1 自定义函数
1. 编写一个计算整数立方用的函数,并计算1到10每个数和其前一个相邻整数的立方差。
例如2,前一个相邻数为1,两者的立方差等于7
2. 编写函数,把华氏温度转换为摄氏温度,公式为C=(F-32)*5/9,并调用函数计算73℉对应的摄氏温度。
3. 编写函数,利用边长计算三角形面积
给出三条边,判断是否可以组成三角形,如果可以的话计算面积
提示:利用边长计算三角形面积公式为海伦公式
,p为周长的一半
4. 自定义函数计算一个空心圆柱体的体积,输入外径R、内径r和高h,计算出体积。
提示:圆柱体的体积
5. 自定一个计算BMI的函数,输入身高,体重,输出BMI
6. 一个数如果恰好等于它的所有因子之和,这个数就称为"完数"。例如6=1+2+3。
如何确定完数,欧几里发现,只要2n-1是一个素数,则2n-1(2n-1)一定一个完数(n>=2)。编写程序找出最小的5个完数。要求自定义函数判断2n-1是否是素数
7. 实现一个函数,可统计任一整数中某个数字出现的次数。例如-21252中,2出现了3次,则该函数应该返回3。
8. 求方程ax^2 + bx + c = 0的根。其中参数a,b,c是从main函数输入的。
6.2 递归
1. 编写一个递归函数,返回整数x和y的最大公约数
2. 猴子摘了一堆桃子,第一天吃了一半,觉得不过隐又吃了一个;第二天吃了剩下的一半零一个;以后每天如些,到第十天,猴子一看只剩下一个了。问最初有多少个桃子
3. 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
4. 用递归思想倒序输出一个正整数。例如给出正整数 n=12345,希望以各位数的逆序形式输出,即输出54321
5. 汉诺塔问题: 给定三根柱子,记为a, b, c,其中a柱子上有n个盘子,且上面的盘子一定比下面的盘子小。问:将a柱上的盘子经由b柱移动到c柱最少需要多少次?
移动时应注意:
① 一次只能移动一个盘子
②大的盘子不能压在小盘子上
6.3 可复用脚本
1. 将利用边长计算三角形面积的方法编辑为可复用脚本,并调用
2. 将BMI的计算方法编辑为可复用脚本,并调用
参考答案:
6.1 自定义函数
1.
A | B | |
1 | func | return A1*A1*A1 |
2 | =10.(func(A1,~)-func(A1,~[-1])) |
2.
A | B | |
1 | func | return (A1-32)*5/9 |
2 | =func(A1,73) |
3.
A | B | C | D | |
1 | func | |||
2 | if A1 + B1 > C1 && A1 + C1 > B1 && B1 + C1 > A1 | =A1+B1+C1 | =C2/2 | |
3 | =sqrt(D2*(D2-A1)*(D2-B1)*(D2-C1)) | |||
4 | return C3 | |||
5 | else | return "This side length group does not form a triangle" |
4.
A | B | C | |
1 | func | ||
2 | return pi()*A1*A1*C1-pi()*B1*B1*C1 |
5.
A | B | |
1 | func | |
2 | return B1/(A1*A1) |
6.
A | B | C | D | E | |
1 | 0 | 2 | |||
2 | for A1<5 | if func(A5,B1)==1 | >output(int(power(2,B1-1)*(power(2,B1)-1))) | >A1+=1 | |
3 | >B1+=1 | ||||
4 | |||||
5 | func | =power(2,A5)-1 | |||
6 | if A5==2 | return 1 | |||
7 | else | for 2,sqrt(B5) | if B5%C7==0 | return 0 | |
8 | break C7 | ||||
9 | return 1 |
7.
A | B | C | D | |
1 | func | 0 | ||
2 | if A1<0 | >A1=-A1 | ||
3 | if A1==0 && B1==0 | return 1 | ||
4 | for A1 | if A1%10==B1 | >C1+=1 | |
5 | >A1\=10 | |||
6 | return C1 | |||
7 | =func(A1,-21252,2) |
8.
A | B | C | D | |
1 | func | |||
2 | if A1==0 | return -C1/B1 | ||
3 | else | =B1*B1-4*A1*C1 | ||
4 | if C3 >0 | return [(-B1+sqrt(C3))/(2*A1),(-B1-sqrt(C3))/(2*A1)] | ||
5 | else if C3==0 | return -B1/(2*A1) | ||
6 | else | return "There are no real roots" | ||
7 | =func(A1,3,8,5) |
6.2 递归
1.
A | B | C | |
1 | func | ||
2 | if B1==0 | return A1 | |
3 | else | return func(A1,B1,A1%B1) | |
4 | =func(A1,54,63) |
2.
A | B | C | |
1 | func | ||
2 | if A1==1 | return 1 | |
3 | return (func(A1,A1-1)+1)*2 | ||
4 | =func(A1,10) |
3.
A | B | C | |
1 | func | ||
2 | if A1==1 | return 1 | |
3 | elseif A1==2 | return 2 | |
4 | else | return func(A1,A1-1)+func(A1,A1-2) | |
5 | =func(A1,9) |
4.
A | B | C | |
1 | func | if A1<10 | return output(A1%10) |
2 | =output(A1%10) | ||
3 | return func(A1, A1\10),B2 | ||
4 | =func(A1,12345) |
递归思想:首先输出这个数的个位数,然后再输出前面数字的个位数,直到之前没数字。
5.
A | B | C | |
1 | func | if A1==1 | return 1 |
2 | return 2*func(A1,A1-1)+1 | ||
3 | =func(A1,10) |
英文版