递归函数

力扣 OJ 342. 4的幂

自古美人都是妖i 提交于 2020-02-09 09:17:57
题目: 给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。 示例 1: 输入: 16 输出: true 示例 2: 输入: 5 输出: false 进阶: 你能不使用循环或者递归来完成本题吗? 代码: class Solution { public: bool isPowerOfFour(int n) { if (n <= 0)return false; while (n % 4 == 0)n /= 4; return n == 1; } }; 来源: CSDN 作者: csuzhucong 链接: https://blog.csdn.net/nameofcsdn/article/details/104221338

非递归遍历二叉树

旧城冷巷雨未停 提交于 2020-02-08 23:06:54
#类名称:BinaryTreeNode #类说明:定义一个二叉树的结点 #类释义:分别有左孩子LeftChild,右孩子RightChild和数据data class BinaryTreeNode(object): def __init__(self): self.data='#' self.LeftChild=None self.RightChild=None class TreeState(object): def __init__(self,BinaryTreeNode,VisitedFlag): self.BinaryTreeNode = BinaryTreeNode self.VisitedFlag = VisitedFlag #类说明:定义一个二叉树 class BinaryTreeNonRecursive(BinaryTreeNode): #创建二叉树的函数 def CreateBinaryTree(self,Root): data=input('->') if data=='#': Root=None else: Root.data=data Root.LeftChild=BinaryTreeNode() self.CreateBinaryTree(Root.LeftChild) Root.RightChild=BinaryTreeNode() self

树据结构与算法——二分搜索树 动画演示

…衆ロ難τιáo~ 提交于 2020-02-05 19:05:18
文章目录 一、二分查找法 二分查找法变变种:floor和ceil 二、二分搜索树 实现查找表的比较: 二分搜索树定义 插入元素 查找元素 三、二分搜索树的遍历 二分搜索树的遍历(深度优先遍历) 二分搜索树的层序遍历(广度优先遍历) 四、二分搜索树删除节点 删除最大值,最小值 删除任意节点 附录   二叉搜索树是用来解决查找问题的,在介绍二叉搜索树之前,先学习二分查找法。 一、二分查找法   二分查找法只能对于 有序数列 使用(排序后的数组),在中间找一个元素v如果不是v,这在<v和>v两部分查找,时间复杂度为O(logn),如下图所示: 二分查找代码: // 二分查找法,在有序数组arr中,查找target // 如果找到target,返回相应的索引index // 如果没有找到target,返回-1 template < typename T > int binarySearch ( T arr [ ] , int n , T target ) { // 在arr[l...r]之中查找target int l = 0 , r = n - 1 ; while ( r > l ) { //int mid = (l + r)/2; // 防止极端情况下的整形溢出,使用下面的逻辑求出mid int mid = l + ( r - l ) / 2 ; //如果刚好找到 if ( arr [

【递归与递推】递归函数(reduce)------------------记忆化搜索

筅森魡賤 提交于 2020-02-05 02:29:52
题目描述 考虑如下的3参数递归函数w(a,b,c); 如果a≤0或b≤0或c≤0,则w(a,b,c)=1; 如果a>20或b>20或c>20,则w(a,b,c)=w(20,20,20); 如果a其他情况下:w(a,b,c)=w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1, b-1,c-1)。 设计一个程序,快速计算w(a,b,c)并给出结果。 输入 1行整数,包含3个数值,分别对应a、b和c的值。 输出 一个数,即w(a,b,c)的结果。 样例输入 Copy 50 50 50 样例输出 Copy 1048576 #include < bits / stdc ++ . h > using namespace std ; int f [ 21 ] [ 21 ] [ 21 ] ; int a , b , c ; int dfs ( int a , int b , int c ) { if ( a <= 0 || b <= 0 || c <= 0 ) return 1 ; else if ( a > 20 || b > 20 || c > 20 ) return dfs ( 20 , 20 , 20 ) ; else if ( f [ a ] [ b ] [ c ] ) return f [ a ] [ b ] [ c ] ; else f [ a ]

go语言基础二 函数 ,递归函数 ,指针

五迷三道 提交于 2020-02-04 20:34:27
函数的定义: func 函数名(参数列列表)(返回参数列列表){ //函数体 } func funcName (parametername type1, parametername type2...)(output1 type1, output2 type2...) { / / 逻辑代码 // 返回多个值 return value1, value2... } 函数定义解析:    func:函数关键字。 函数由 func 开始声明   funcName:函数名。 函数名和参数列列表⼀一起构成了了函数签名。 函数名由字⺟母、数字和下划线组成。函数名的第⼀一个字⺟母不不能为 数字。在同⼀一个包内,函数名称不不能重名。        parametername type:参数列列表。 参数就像⼀一个占位符,定义函数时的参数叫做形式参数,形参变 量量是函数的局部变量量;当函数被调⽤用时,你可以将值传递给参数, 这个值被称为实际参数。 参数列列表指定的是参数类型、顺序、及参数个数。 参数是可选的,也就是说函数也可以不不包含参数。 参数类型的简写 在参数列列表中,如果有多个参数变量量,则以逗号分隔;如果 相邻变量量是同类型,则可以将类型省略略。 例例如:func add (a , b int) {} Go语⾔言的函数⽀支持可变参数。接受变参的函数是有着不不定数量量的 参数的。 func

2、整数逆序的多种方法

青春壹個敷衍的年華 提交于 2020-02-03 07:22:11
2、整数逆序的多种方法 一、递归法逆序 :输入一个正整数n,将其逆序输出。要求定义和调用函数reverse(num),其功能是将num逆序输出,要求用递归实现。 二、经典常用的 :关键代码是 d = x%10; ret=ret*10 + d; 三、更简单的 :仅针对三位整数 四、更复杂的 :仅针对三位整数 五、 : 说明:x/100得x的百位数字,x%100则是去掉x的百位数字,x%10得x的个位,依此类推。 //一、递归法逆序: # include <stdio.h> void reverse ( int n ) ; int main ( ) { int n ; scanf ( "%d" , & n ) ; reverse ( n ) ; return 0 ; } void reverse ( int n ) { if ( n < 10 ) { printf ( "%d" , n ) ; } else { printf ( "%d" , n % 10 ) ; reverse ( n / 10 ) ; } } //二、经典常用的: # include <stdio.h> int main ( ) { int x , d , ret = 0 ; scanf ( "%d" , & x ) ; while ( x > 0 ) { d = x % 10 ; ret = ret * 10 +

快速排序 C语言 递归调用

[亡魂溺海] 提交于 2020-02-01 18:51:35
递归:要满足两个条件 1.循环部分,2.基准条件。 int partition( int a[], int left, int right ) a []是要从左到右排序的数组,其中left是第一个元素的索引,right是最后一个元素的索引。此函数确定数组中的枢轴,并将所有比pilov少的元素向左移动,而将所有所有元素向右移动。重新定位所有元素后,它将返回枢轴的索引。 其中先比较左边,中间,右边三数的大小关系,在将pivot和right-1两个位置进行交换,从而只需比较left-(righth-1)之间的数, while (1) { /*将序列中比基准小的移到基准左边,大的移到右边*/ while ( a[++Low] < Pivot ) ; while ( a[--High] > Pivot ) ; if ( Low < High ) { temp = a[Low]; a[Low] = a[High]; a[High] = temp; }//Swap( &A[Low], &A[High] ); else break; 这部分代码是关键,主要是实现让两数进行交换,当不满足条件时推出循环,最重要的是要实现返回递归可以实现下去的条件, //Swap( &A[Low], &A[Right-1] ); /* 将基准换到正确的位置 */ if(Low < right-1){ temp = a

python基础之函数,递归,内置函数

一曲冷凌霜 提交于 2020-02-01 17:18:13
一、数学定义的函数与python中的函数    初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变量,y是x的函数。自变量x的取值范围叫做这个函数的定义域 例如y=2*x。 python中函数定义:函数是逻辑结构化和过程化的一种编程方法。 python中函数定义方法: def test(x): "The function definitions" x+=1 return x def:定义函数的关键字 test:函数名 ():内可定义形参 "":文档描述(非必要,但是强烈建议为你的函数添加描述信息) x+=1:泛指代码块或程序处理逻辑 return:定义返回值 调用运行:可以带参数也可以不带 函数名() View Code 来源: https://www.cnblogs.com/eryuehong/p/12249071.html

巧用记忆化搜索代替暴力递归(洛谷P1464题题解,Java语言描述)

强颜欢笑 提交于 2020-01-30 15:44:59
题目要求 P1464题目链接 分析 如果……你信了这题干,真的写了递归……TLE警告!!! 所以,就需要优化嘛…… [−9223372036854775808,9223372036854775807]这个范围,就是C的 longlong / Java的 long 诶,算是一种数很大但还有良心的提示吧。 这题比较适合记忆化搜索,这也是我第一次写 记忆化搜索 的题解诶,就扯一扯…… 一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,以后再次遇到这个状态的时候,就不必重新求解了。这种方法综合了搜索和动态规划两方面的优点,因而还是很有实用价值的。 对于本题的话,只要一个记忆化储存就可以避免大量运算量(大佬们都说这玩意和递推/动态规划差不多)。 主要思路就是 开一个三维数组 ,把每一个“w”函数的值储存起来,下一次就可以 直接调用 ,节省大量时间。 使用的时候还要先想,记忆化的数组要开多大。对于这个题来说,输入数据在long(Java)范围内,对于每一组a,b,c都使用一个变量来进行记忆化是不现实的。 但是,根据题意,当a<0 or b<0 or c<0时,返回值都是1,当a>20 or b>20

内置函数2 递归函数

Deadly 提交于 2020-01-30 09:59:07
列表和元祖 list : 将一个可迭代对象转换化列表(如果是一个字典,默认将key 作为列表的元素,那个值是不会加进来的) tuple: 将一个可迭代对象转化成元组(如果是字典,默认将key作为列表的元素) l = list({'k1':1,'k2':2}) print(l) tu = tuple({'k1':1,'k2':2}) print(tu) ['k1', 'k2'] ('k1', 'k2') reversed : 将一个序列翻转,并返回此翻转序列的迭代器 l = [1,5,7,9,3,2,4] print(list(reversed(l)))---------------------》[4, 2, 3, 9, 7, 5, 1] 结果是一个迭代器 注意 如果不用 list 包起来的话 ---》<list_reverseiterator object at 0x00000000028E0A58> 这样人是识别不了的 不然就for循环 可以循环打印出来 l1 = [1,3,4,2,6]s1 = 'abcdefg'dic = {'name':'alex','age':1000,'hobby':'oldwomen'} # 不行print(reversed(l1))for i in reversed(l1): print(i)for i in reversed(s1): print