C语言递归练习(附答案)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Else if n=1 then fib:=1 Else fib:=fib(n-1)+fib(n-2);
End; Begin
Read(m); P:=fib(m); Writeln(‘fib(’,mm’)=’,p) End. 7.设有 2^n 个运动员要进行网球比赛。现要设计一个满足以下要求的比赛日程表: (1)、每个选手必须与其他 n-1 个选手各赛一次; (2)、每个选手每天只能参赛一次; (3)、循环赛在 n-1 天内结束。program match; const k=3;n=8; var s:array[1..n,1..n] of integer;
else s:=s(n-1)+s(n-2); end; begin
repeat write('N=');readln(n); until n>0; writeln('s=',s(n)); readln; end. 6.斐波那切数列 递归:var m,p:integer; Function fib(n:integer):integer; Begin If n=0 then fib:=0
int num; printf("please input the num:"); scanf("%d",&num); fc(num); printf("\n"); return 0; } 14. 计算 M=max(a,b,c)/[max(a+b,b,c)*max(a,b,b+c)],其中 a,b,c 由键盘输入。skip 15. 梯有 N 阶,上楼可以一步上一阶,也可以一次上二阶。编一个程序,计算共有多少种 不同的走法。 return 1+(fc(n-1)+fc(n-2)
End; Begin
Writeln(‘input n ge shu’); For k:=1 to n do read(a[k]); Read(x); F:=1;r:=n; Search(x,f,r); End. 2.hanoi 塔问题。 递归:procedure Hanoi(n:integer;x,y,z:char);
典型例题: 1.设有 n 个数已经按从大到小的顺序排列,现在从键盘上输入 n,判断它是否在这 n 个数中, 如果存在则输出“yes”否则输出“no”。 Program lx4;
Const n=30; Var a:array[1..n]of integer;
F,r,x,k:integer; Program search(x,top,bot:integer); Var mid:integer;
16 26 126 36 136 输出: 6 21. 自然数的拆分问题。给定自然数 n,将其拆分成若干自然数的和。输出所有解,每组解中 数字按从小到大排列。相同数字的不同排列算一组解。如: 3=1+1+1 3=1+2 3=3 22. 用递归的方法求 N 个数中最大的数及其位置。 23. 写出折半查找的递归算法。 24. 快速排序法。
if(i<2) {
if(i == 0) return 0; else return 1; } return fbi(i-1) +fbi(i-2); } 9. 求两个数的最大公约数。 fgongyue(int m,int n)//m 要大于 n,前面可以交换让它实现 { if(n == 0) return m; fgongyue(n,m%n); } 10. 求两个数的最小公倍数。 最小公倍数等于2个数之积乘最好公约数 m*n/fgongyue(m,n) 11. 输入一个数,求这个数的各位数字之和。 add_every_num(int num) { if(num<10) return num; return num%10+add_every_num(num/10); } 12. 角谷定理。输入一个自然数,若为偶数,则把它除以 2,若为奇数,则把它乘以 3 加 1。 经过如此有限次运算后,总可以得到自然数值 1。求经过多少次可得到自然数 1。 如:输入 22, 输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 STEP=16
} }
int main(int argc, char* argv[]) {
int n,step; printf("Please input the num:"); scanf("%d",&n); step = fc(n); printf("\nStep = %d\n",step); return 0; }
16. 某人写了 n 封信和 n 个信封,如果所有的信都装错了信封。求所有的信都装错信封共有 多少种不同情况? 17. 给出一棵二叉树的中序与后序排列。求出它的先序排列。 18. 求把一个整数 n 无序划分成 k 份互不相同的正整数之和的方法总数。 19. 已知一个一维数组 A[1..N]。{N<50} 又已知一整数 M。如能使数组 A 中任意几个元素之 和等于 M,则输出 YES,反之则为 NO。 20. 要求找出具有下列性质的数的个数(包含输入的自然数 n): 先输入一个自然数 n(n<=500),然后对此自然数按照如下方法进行处理: ①. 不作任何处理; ②. 在它的左边加上一个自然数,但该自然数不能超过原数首位数字的一半; ③. 加上数后,继续按此规则进行处理,直到不能再加自然数为止. 样例: 输入: 6 满足条件的数为 6
if(times==10) return begin; return fruit((begin+1)*2,times+1); } 6. 有雌雄一对兔子,假定过两个月便可繁殖雌雄各一的一对小兔子。问过 n 个月后共有多少 对兔子? 7. 一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经 过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭 子? duck(int begin,int times) {
dic 递归基础练习题: 1. 求 1+2+3+……+n 的值 int sum(int a,int b) {
if(b==a) return a; return a+sum(a+1,b); } 2. 求 1*2*3*……*n 的值 cheng(int begin,int end) { if(begin==end) return begin; return begin * cheng(begin+1,end); } 3. 数的全排列问题。将 n 个数字 1,2,…n 的所有排列按字典顺序枚举出猴 231 213 312 321 4. 数的组合问题。从 1,2,…,n 中取出 m 个数,将所有组合按照字典顺序列出。 如 n=3,m=2 时,输出: 12 13 23 5. 小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一 半,又多吃一个.以后每天早上吃前一天剩下的一半另一个.到第 10 天早上猴子想再吃时发现, 只剩下一个桃子了.问第一天猴子共摘多少个桃子? fruit(int begin,int times) {
1:d:=0; 2:d:=1; else d:=(n-1)*(d(n-1)+d(n-2)); end; end; begin repeat write('n='); readln(n); if n<=0 then writeln('Once more!') until n>0; writeln('d=',d(n)); readln; end. 4.有一对雌雄兔子,假定两个月便可以繁殖雌雄各一对兔子。问 n 各月后共有多少对兔子? 递归的三要素: 递归的形式:T[n]= T[n-1]+ T[n-2] 基本:T[1]=1,T[2]=1 结束条件:n 个月 program rabbit; var n:integer; function fa(n:integer):integer; begin if n<3 then fa:=1
Begin if top<=bot then Begin Mid=(top + bot) div 2; If x =a[mid] then writeln(x:5,mid:5,’yes’) else If x<a[mid] then search(x,top,mid-1) Else search(x,mid+1,r); End else Writeln(x:5,‘no’);
思考题 : 1、数学宝塔,从最顶上走到最底层,每次只能走到下一层的左边或右边的数字,求出使所 走到的所有数字之和为 60 的途径。
7
46 693 6371 25328 5947 32 6418563 39768415 257357842 2、 汉诺塔问题:设有三个塔座,依次命名为 x,y,z。有 z 个直径不同的圆盘,由小到大依次 编号为 1、2、……,n。开始时,它们全部按递减的次序插在塔座上。现要求按下列规则把 n 个圆盘按次序插放在 z 塔座上。 (1)、每次只能移动一个圆盘; (2)、圆盘可以从任一个塔座上移到另一个塔座上; (3)、任何时刻都不能把一个较大的圆盘压在较小的圆盘上。
#include "stdafx.h" #include "stdio.h"
int i = 1;
int fc(int n) {
if(n Baidu Nhomakorabea= 1) {
printf("%d",n); return i;
} else if(n%2 == 0) {
printf("%d\t",n); fc(n/2); i++; } else { printf("%d\t",n); fc(n*3+1); i++;
else fa:=fa(n-1)+fa(n-2); end; begin write('n=');readln(n); writeln('The number of the rabbits:',fa(n)); end. 5.梯有 N 阶,上楼可以一步上一价,也可以一次上二阶。编一个程序,计算共有多少种不同 的走法。 递归的形式:s[n]=s[n-1]+s[n-2] 基本式子:s[1]=1;s[2]=2 program upstairs; var n:integer; function s(n:integer):longint; begin if (n=1)or(n=2) then s:=n
13. 将十进制转换为二进制。
#include "stdafx.h" #include "stdio.h"
int fc(int num) {
if(num == 1) {
printf("%d",num); return 0; } fc(num/2); printf("%d",num%2); }
int main(int argc, char* argv[]) {
Begin
If n=1 then writeln(x,’--’n,’---’,z) Else begin Hanoi(n-1,x,z,y); Writeln(x,’--’,n,’---’,z); Hanoi(n-1,y,x,z) End;
End; Begin
Write(‘input n:’); Read(n); Hanoi(n,’A’,’B’,’C’) End. 3.有 n 个硬币(n 为偶数)正面朝上排成一排,每次将 n-1 个硬币翻成朝上为止。编程让计 算机把翻硬币的最简过程及翻币次数打印出来(用*代表正面,用 0 代表反面)。 基本形式:D[1]=0;d[2]=1 递归式:d[n]= (n-1)*( d[n-1] + d[n-2]) var n:integer; function d(n:integer):longint; begin case n of
if(times==7) return begin; return duck((begin+1)*2,times+1); }
8. 著名的菲波拉契(Fibonacci)数列,其第一项为 0,第二项为 1,从第三项开始,其每一项 都是前两项的和。编程求出该数列前 N 项数据。 int fbi(int i) {
相关文档
最新文档