现在的位置: 首页 > 综合 > 正文

常见递归应用总结

2013年07月10日 ⁄ 综合 ⁄ 共 2544字 ⁄ 字号 评论关闭

递归:函数调用本身

 

递归与迭代的区别:

例子:fibonacci

    递归:return  fibonacci(n) = fibonacci(n-1) + fibonacci(n-2);        递归:从高到底    从未知到已知   往回 

 

    迭代:for(i=2; i<=n; i++)                                                                   迭代:从低到高    从已知到未知   向上

                 fibonacci(i) = fibonacci(i-1) + fibonacci(i-2);

 

(1)阶乘

    (a):递归方法

#include <stdio.h>
#include <ctype.h>
int stratum(int num);

main()
{
 char c;
 int n;
 int result;
 do
 {
  printf("input a number:/n");
  scanf("%d", &n);
  result = stratum(n);
  printf("%d! = %d/n", n, result);
  printf("continue? y or n/n");
  getchar();
  c = toupper(getchar());                                         //注意:这里要用两个getchar()
 }while(c == 'Y');
}

int stratum(int num)
{
 if(num == 0 || num == 1)
  return(1);
 else
  return(num*stratum(num-1));
}

 (b)非递归方法:(即迭代)

/* no use recursive */

#include <stdio.h>
#include <ctype.h>

int stratum(int num);

main()
{
 char c;
 int n;
 int result;
 do
 {
  printf("input a number:/n");
  scanf("%d", &n);
  result = stratum(n);
  printf("%d! = %d/n", n, result);
  printf("continue? y or n/n");
  getchar();
  c = toupper(getchar());
 }while(c == 'Y');
}

int stratum(int num)
{
 int i;
 int temp = 1;
 if(num == 0 || num == 1)
  return(1);
 else
  for(i = 2; i<=num; i++)
  {
   temp *= i; 
  }
 return(temp);
}
====================================================

(2)fibonacci

(a)递归:

#include <stdio.h>
#include <ctype.h>

int fibonacci(int num);

main()
{
 char c;
 int n;
 int result;
 do
 {
  printf("input a number:/n");
  scanf("%d", &n);
  result = fibonacci(n);
  printf("%d/n", result);
  printf("continue? y or n/n");
  getchar();
  c = toupper(getchar());
 }while(c == 'Y');
}

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

 

(b)非递归(迭代)

#include <stdio.h>
#include <ctype.h>

int fibonacci(int num);

main()
{
 char c;
 int n;
 int result;
 do
 {
  printf("input a number:/n");
  scanf("%d", &n);
  result = fibonacci(n);
  printf("%d/n", result);
  printf("continue? y or n/n");
  getchar();
  c = toupper(getchar());
 }while(c == 'Y');
}

int fibonacci(int num)
{
 int i;
 int temp = 0;
 int a = 1;
 int b = 1;
 if(num == 0 || num == 1)
  return(1);
 else
  for(i = 2; i<=num; i++)
  {
   temp = a + b;
   a = b;
   b = temp;
  }
 return temp;
}

 

=====================================

(3)Hanoi塔        移动n个盘子  至少要2的n次方减1次

#include <stdio.h>
#include <ctype.h>

int hanoi(int num, char a, char b, char c);

main()
{
 char c;
 char A = 'A';
 char B = 'B';
 char C = 'C';
 int i;
 int n;

 do
 {
  printf("input a number:/n");
  scanf("%d", &n);
  if(n == 0)
  {
   printf("no have disk/n");
  }
  else
   hanoi(n, A, B, C);
  printf("continue? y or n/n");
  getchar();
  c = toupper(getchar());
 }while(c == 'Y');
}

int hanoi(int num, char a, char b, char c)
{
 if(num == 1)
  printf("%c -> %c/n", a, c);
 else
 {
  hanoi(num-1, a, c, b);
  printf("%c -> %c/n", a, c);
  hanoi(num-1, b, a, c);
 }
}

抱歉!评论已关闭.