递归该怎么写(一)

递归定义

递归:无限调用自身这个函数,每次调用总会改动一个关键变量,直到这个关键变量达到边界的时候,不再调用。

我们现在开始来举例子,然后总结如何写好递归程序。(这种针对可以找出数学表达式的递归程序,对于写不出数学表达式的或者不好找的会在之后的博客中补充)

例子1: n的阶乘。

我们先来写出数学表达式

代码部分

1 __author__ = "WSX"
2
3 def f(n):
4     if n == 1:
5         return 1
6     else:
7         return f(n-1) * n
8
9 print(f(3))

例子 2: 斐波那契数列

我们还是来写数学表达式,嘿嘿。

相应代码:

1 __author__ = "WSX"
2 def fib(n):
3     if n == 1:
4         return 1
5     if n == 2:
6         return 1
7     if n>2:
8         return fib(n-2) + fib(n-1)
9 print(fib(4))

例子3 :求最大公约数

老样子,先写数学表达式。是不是感觉没啥难度了(可以用数学表达出来的)

return 就是等号 !!!

代码:

1 __author__ = "WSX"
2
3 def gcb(a, b):
4     if a%b == 0:
5         return b
6     else:
7         return gcb(b, a%b)

到了这里是不是对于这种类型的递归已经能十分简单的写出来了?  我们在看一个稍微高级一点点的例子

例子4: 二分查找

写表达式,你会想这个表达式怎么写??? 下面我们来看。

代码:

 1 __author__ = "WSX"
 2
 3 def s(L , left , right , target):
 4     mid = (left + right) // 2
 5     if target == L[mid]:
 6         return mid
 7     if left > right:
 8         return None
 9     if target > L[mid]:
10         return s(L,mid+1 , right,target)
11     else:
12         return s(L, left, mid-1, target)
13 L = [3,5,7,8,55,88]
14 print(s(L, 0 ,len(L),88))

我总结的经验是:

确定需要递归的参数

写出递归的表达式(一定找到出口) 就是结束的条件

将表达式转化为代码(函数名 = 表达式左侧        函数内部 = 表达式右侧        return = 等号)

原文地址:https://www.cnblogs.com/WSX1994/p/10751446.html

时间: 2024-10-28 21:37:11

递归该怎么写(一)的相关文章

归并排序 非递归 不回写

#include<iostream>using namespace std;void Merge(int a[],int b[],int first,int mid,int last)//合并两个有序数组{ int p=first,q=mid+1; int pos=first; while(p<=mid&&q<=last) { if(a[p]<a[q]) { b[pos++]=a[p++]; } else { b[pos++]=a[q++]; } } if(p

归并排序,还有非递归方式没写

#include <iostream> using namespace std; void Merge(int SR[],int i,int m,int n)//n表示数组中最后一个元素的下标,i表示第一个元素的下标,m表示前一个数组最后一个元素的下标 { int *TR=new int[n-i+1]; int ptr1=i; int ptr2=m+1; int j=0; while(ptr1<=m&&ptr2<=n)//可能有一个没有完 { if(SR[ptr1]

递归程序如何写,要满足三个条件,切记!

python中递归函数的使用: def division(n): print(n) if int(n/2)==0: return n#递归特性一:必须有一个明确的结束条件 return division(int(n/2))#递归特性而:每次递归都是为了让问题规模变小 division(10)#递归特性三:递归层次过多会导致栈溢出,且效率不高--------------------- 作者:贾公子 来源:CSDN 原文:https://blog.csdn.net/j904538808/articl

堆排序--还有递归法没有写

#include <iostream> using namespace std; void HeapAdjust(int arr[],int s,int m)//大顶堆,m表示最后一个数字位置,s表示第一个位置,都是下标 { int cur=s; int index; int tmp=arr[cur]; while(cur*2+1<=m) { index=cur*2+1;//left child if(index<m&&arr[index]<arr[index

用递归和迭代写斐波那契数列,前n列的和

首先注意: 方法不调用不执行,调用才执行,并且把值返回到方法的调用处!! public class Fei_Bo_Na_Qi{    public static void main(String[] args){        int m = 100;        System.out.println( "斐波那契数列的第 "+m+" 位数为: "+m1(m) );//  在输出的时候调用函数    }    public static int  m1(int i

如何将循环写成递归

转载:http://blog.csdn.net/feixiaoxing/article/details/6838362 其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容.当然,如果循环还好理解一点,那么递归却没有那么简单.我们曾经对递归讳莫如深,但是我想告诉大家的是,递归其实没有那么可怕.所谓的递归就是函数自己调用自己而已,循环本质上也是一种递归.  1)求和递归函数 我们可以举一个循环的例子,前面我们说过,如果编写一个1到n的求和函数怎么写呢,你可能会这么写: int cal

一步一步写算法(之循环和递归)

原文:一步一步写算法(之循环和递归) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容.当然,如果循环还好理解一点,那么递归却没有那么简单.我们曾经对递归讳莫如深,但是我想告诉大家的是,递归其实没有那么可怕.所谓的递归就是函数自己调用自己而已,循环本质上也是一种递归.  1)求和递归函数 我们可以举一个循环的例子,前面我们说过,如果编写一个1到n的求和函数怎么写呢,你可能会

递归的一些应用(一)遍历文件夹

函数的递归调用 递归的含义 递归其实也只是一种算法上的描述,不是一种新的语法! 有时候,我们解决问题的时候,会遇到这种情况,当我们把一个大的问题按照某种解决方案分成若干个小的问题的时候,发现这些小问题的解决方案其实和刚才大问题的解决方案又是一样的! 典型的,比如:求阶乘! 10! = 10 * 9! 9! =  9 * 8! 8! = 8 * 7! …… 语法上,函数的递归调用,就是函数在执行的过程中自己又调用自己! 递归的两个要点: 1,  递归的出口:就是指什么时候停止递归调用 2,  递归

搜索分析(DFS、BFS、递归、记忆化搜索)

搜索分析(DFS.BFS.递归.记忆化搜索) 1.线性查找 在数组a[]={0,1,2,3,4,5,6,7,8,9,10}中查找1这个元素. (1)普通搜索方法,一个循环从0到10搜索,这里略. (2)递归(从中间向两边) 1 //递归一定要写成记忆化递归 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool vis[11]; 5 int count1=0; 6 7 void search(int n){ 8 count1++; 9