什么是递归?
在数学与计算机科学中,递归(Recursion)是指在函数的定义中使用函数自身的方法。实际上,递归,顾名思义,其包含了两个意思:递 和 归,这正是递归思想的精华所在。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况,这也正是递归的定义所在。格外重要的是,这个解决问题的函数必须有明确的结束条件,否则就会导致无限递归的情况。
而我们说的非递归通俗的说就是不用到递归
而常见的几种问题就是我们标题中提到的三个问题
1.斐波那契
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……
* 在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)
其代码可如下:
#include<stdio.h> long long fibo(long long i){ if(i == 1){ return 1; } if(i == 2){ return 1; } if(i > 2){ return fibo(i - 1) + fibo(i - 2); } } long long fibo2(long long n){ if(n == 1){ return 1; } if(n == 2){ return 1; } long long f1, f2, f3; f1 = 1; f2 = 1; for(int i = 3; i <= n; i++){ f3 = f2 + f1; f1 = f2; f2 = f3; } return f3; } int main(){ long long i, sum; scanf("%d",&i); sum = fibo2(i); printf("非递归%lld\n",sum); sum = fibo(i); printf("递归%lld\n",sum); return 0; }
2.阶乘
n!=1*2*3*....*n
其递归与非递归代码可如下
#include<stdio.h> int jc(int n){ if(n == 0){ return 1; } if(n == 1){ return 1; } if(n > 2){ return n * jc(n - 1); } } int jc2(int n){ int sum = 1; for(int i = 1; i <=n; i++){ sum = sum * i; } return sum; } int main(){ int i, sum; scanf("%d",&i); sum = jc2(i); printf("%d ",sum); return 0; }
3.汉诺塔
古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。
* 有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,
* 小盘在上。在移动过程中可以利用B座。要求输入层数,运算后输出每步是如何移动的。
其代码可如下:
#include <stdio.h> int sum = 0; void hanoi(int n , char A , char B , char C)//n个圈圈在柱子A上,借助柱子B,移动到柱子C上 { sum++; if(n == 1)//如果A柱子上只有一个圈圈,直接移动到C上 printf("%c --> %c\n",A,C); else { hanoi(n-1,A,C,B);//将A柱子上的n-1个圈圈,借助柱子C,移动到柱子B上 printf("%c --> %c\n",A,C);//将A柱子上的最后一个圈圈移动到柱子C上 hanoi(n-1,B,A,C);//将B柱子上的n-1个圈圈,借助柱子A,移动到柱子C上 } } int main() { hanoi(8,'A','B','C'); printf("%d",sum); return 0; }