>第 5 章 深入理解函数>递归>习题

刘艳明 lonny_liu@hotmail.com
2009-04-04 19:59:44

1、#include <stdio.h>

int gcd(int a,int b)
{
	if(!(a%b))
		return b;
	else return gcd(b,a%b);
}
int main(void)
{
	int x,y,z;
	printf("please input two positive integer number:\n");
	scanf("%d %d",&x,&y);
	if(!(x>0&&y>0))
	{
	printf("Only for positive integer number\n");
	scanf("%d %d",&x,&y);
	}
	z=gcd(x,y);
    printf("The greatest common divisor of %d and %d is %d\n",x,y,z);
	return 0;
}
2、#include <stdio.h>

int fib(int n)
{
	if(n==0||n==1)
	  return 1;
	else return fib(n-1)+fib(n-2);
}

int main(void)
{
	int n,z;
	printf("Please input the number of fib(n>=0):\n");
	scanf("%d",&n);
	if(n<0)
	{
		printf("only for >=0 integer number\n");
		scanf("%d",&n);
	}
	z=fib(n);
	printf("The fib(%d) is %d.\n",n,z);
	return 0;
}


徐静 xu0jint@hotmail.com
2009-06-08 11:26:05

Euclid 描述是gcd(a,b)表示非负整数a,b的最大公因数,那么:gcd(a,b)=gcd(b,a%b)或者gcd(a,0)=gcd(0,a)=a


宋劲杉 songjinshan@akaedu.org
2009-06-15 12:49:08

呵呵,也可以的,我提的是正整数,你提的是非负整数,对于初学者来说还是正整数好理解一些


zhuangzhy zhuangzhy@gmail.com
2009-09-25 11:23:48

#include<stdio.h>
#include<math.h>
int Euclid(int a,int b){
 if (a%b==0)
        return b;
else
        return Euclid(b,a%b);
        }
int main(void){
        int result0=Euclid(8,4);
        int result1=Euclid(10,4);
        printf("The factorial is %d\n",result0);
        printf("The factorial is %d\n",result1);
        return 0;
}


zhuangzhy zhuangzhy@gmail.com
2009-09-25 11:39:42

#include<stdio.h>
#include<math.h>
int fib(int n){
    if ( n==0 || n==1)
        return 1;
    else
      {int lame1=fib(n-1);
       int lame2=fib(n-2);
       int result=lame1+lame2;
       return result;
      }
                }
int main(void){
        int result=fib(4);
        printf("The Fibonacci  is %d\n",result);
        return 0;
}


周建伟 zhoujianwei1986@126.com
2009-10-06 21:11:46

#include <stdio.h>
int function(int a,int b)
{int gdc;
 if (a%b==0)
   gdc=b;
 else
	 gdc=function(b,a%b);
 return gdc;
}
int main(void)
{int m,n;
 printf("please input two integer number:\n");
 scanf("%d,%d",&m,&n);
 if(m>0&&n>0)
 m=function(m,n);
 else
 {printf("please input two integer number:\n");
  scanf("%d,%d",&m,&n);
 }
 printf("m=%d\n",m);
 return 0;
}


虫子 xusulong@gmail.com
2009-11-28 21:58:50

证明:
假如a除以b能整除,则最大公约数是b,证明完成
否则
不妨假设a > b
a = k*b + a%b (1)
1.b和a%b大公约数是c
则c可以整除a,根据式(1)
2.没有比c更大的数是a和b大约数了
假如有,为d,d > c,那么d可以整除a,可以整除b,那么根据式(1),d可以整除a%b,那么d是b和a%b的约数,所以d <= c,矛盾,因此没有比c更大的


Andy Ho sixand@gmail.com http://sixand.typepad.com/
2010-06-10 23:45:57

#include <stdio.h>
int Euclid(int a, int b);

int main(void)
{
	int a, b;
	scanf("%d", &a);
	scanf("%d", &b);
	printf("a = %d , b = %d , GCD = %d \n", a, b, Euclid(a,b));
	return 0;
}

int Euclid(int a, int b)
{
	if( a % b == 0)
		return b;
	else
		return Euclid(b, a % b);
}


Andy Ho sixand@gmail.com http://sixand.typepad.com/
2010-06-11 00:34:29

修改了一下,是精简过了的。

#include <stdio.h>
int Euclid(int a, int b);
int fib(int n);

int main(void)
{
	int a, b;
	scanf("%d", &a);
	scanf("%d", &b);
	printf("a = %d , b = %d , GCD = %d \nFibonacci number is %d\n", a, b, Euclid(a,b),fib(Euclid(a,b)));
	return 0;
}

int Euclid(int a, int b)
{
	if( a % b == 0)
		return b;
	else
		return Euclid(b, a % b);
}

int fib(int n)
{
	if( n == 0 || n == 1 )
		return 1;
	else
		return  fib(n-1)+fib(n-2);
}


肖德军 xhu_jun@126.com
2010-12-03 16:14:36

老师让用递归的思路写 而且要规范 标准化


xudonglee xudongleee@126.com
2011-01-19 19:30:23

//1
#include <stdio.h>

int gcd(int a, int b)
{
  int x = a % b;

  if(x == 0)
        return b;
  else
        return gcd(b, x);
}

int main(void)
{
  int a, b, num;

  scanf("%d %d", &a, &b);
  num = gcd(a, b);
  printf("The greatest common divisor is %d.\n", num);
  return 0;
}
~     
//2
#include <stdio.h>

int fib(int num)
{
  if(num == 0)
        return 1;
  else if (num == 1)
        return 1;
  else
        return ( fib(num - 1) + fib(num - 2) );
}

int main()
{
  int x, y;

  scanf("%d", &x);
  y = fib(x);
  printf("The Fibonacci array's %d value is %d.\n", x, y);                                                                                
~ return 0;
}    


lingshiying lingshiying@126.com
2011-03-28 11:50:54

虫子 xusulong@gmail.com 
2009-11-28 21:58:50


证明:
假如a除以b能整除,则最大公约数是b,证明完成
否则
不妨假设a > b
a = k*b + a%b (1)
1.b和a%b大公约数是c
则c可以整除a,根据式(1)
2.没有比c更大的数是a和b大约数了
假如有,为d,d > c,那么d可以整除a,可以整除b,那么根据式(1),d可以整除a%b,那么d是b和a%b的约数,所以d <= c,矛盾,因此没有比c更大的

虫子哥们,你没有写出来怎么证明
1.b和a%b大公约数是则c可以整除a,根据式(1)


江民 vipstepstep@163.com
2011-05-13 09:34:50

# include "stdio.h"

int GCD(int a, int b) {
	if(0 == a % b) {
		return b;
	}
	else {
		return GCD(b, a % b);
	}
}

int main(void) {
	int x = 0, y = 0, result = 0;

	scanf("%d %d", &x, &y);

	result = GCD(x, y);

	printf("The greatest common divisor is %d\n", result);
}


int fib(int n) {
	if(0 == n) {
		return 1;
	}

	if(1 == n) {
		return 1;
	}
	else {
		return fib(n - 1) + fib(n - 2);
	}
}

int main(void) {
	int num = 0, result = 0;

	scanf("%d", &num);

	result = fib(num);

	printf("The Fibonacci of n is %d\n", result);

}


奇谭 qqing_lai@hotmail.com http://qqing.kilu.org/
2011-08-30 09:40:41

宋老师,您好:
很高兴有贵教材可以参照学习C语言,在这里向您致谢!
同时,也指出一处错误:Fibonacci数列中首项值应该是 f(0)=0.
再次向您致谢!


孙帅 sunshuai52@126.com
2011-09-21 10:13:04

奇谭,是你错了,宋的书,没错,建议你google一下f(0)=1.


rose rosecky777@163.com
2012-01-13 16:40:45

这些代码你们都验证过了吗?
我怎么运行的时候总是出现 
devide error


如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!