递归经典问题

阶乘

 1 # 阶乘
 2
 3 def jiecheng(n):
 4    if n <= 1:
 5       return 1
 6    return jiecheng(n-1) * n
 7
 8 print(jiecheng(5))
 9
10
11 # 阶乘_尾递归
12 def jiecheng(n, val):
13     if n == 1:
14         return val
15     return jiecheng(n-1, val*n)
16
17 res = jiecheng(5, 1)
18 print(res)

斐波那契

 1 # 斐波那契
 2 def fbnq(n):
 3     # 第一个数和第二个数是1
 4     if n == 1 or n == 2:
 5         return 1
 6     # 返回上一个数加上上上个数
 7     return fbnq(n-1) + fbnq(n-2)
 8
 9
10 # 斐波那契_尾递归
11 def fbnq(n, tem, total):
12    if n == 1:
13       return tem
14    return fbnq(n-1, total, tem+total)

青蛙跳台阶

 1 ‘‘‘
 2 一只青蛙要跳上n层高的台阶
 3 一次能跳一级,也可以跳两级
 4 请问这只青蛙有多少种跳上这个n层高台阶的方法?
 5 ‘‘‘
 6
 7
 8 def tiao(n):
 9    # 当n为1 的时候只有一种方法条台阶
10    if n == 1:
11       return 1
12    # 当n为2 的时候有两种方法上台阶
13    if n == 2:
14       return 2
15    # 与斐波那契相似, 这次台阶的次数是:上次台阶的次数加上上次台阶的次数
16    return tiao(n-2) + tiao(n-1)
17
18 print(tiao(6))

翻转字符串

‘‘‘
底层递归反转字符串 "将14235 反转成53241"
‘‘‘

def fanzhuan(s):
   if len(s) == 0:
      return s
   else:
      # s[1:]传入下个递归函数, s[0]保留在本层递归函数
      # 等递归开始return, 内层递归依次+=外层递归的s[0], 实现反转
      return fanzhuan(s[1:]) + s[0]

# 翻转字符串_尾递归
# s: 需要翻转的字符串
# re_s: 递归结束后return的翻转字符

def fanzhuan(s, re_s=‘‘):

    # 如果传入的str长度为0, 证明str已经被翻转完毕, 返回re_s
    if len(s) <= 0:
        return re_s

    # 除最后一个外, 其余字符串全部传入下层递归函数
    # 本层最后一个str与上一层函数最后一个str相加
    return fanzhuan(s[:-1], re_s+s[-1])

print(fanzhuan(‘abdce‘))

def fanzhuan(s):
    # 传入的str长度为0返回空str, 等待 += 上层的s[0]
    if len(s) <= 0:
        return ‘‘
    # 切片除第一个str外都传入下层递归函数,
    # 然后等待下层递归函数返回 += s[0]
    return fanzhuan(s[1:]) + s[0]

print(fanzhuan(‘abcdef‘))

猴子吃桃

 1 ‘‘‘
 2 猴子吃桃
 3 并吃了一半,又多吃了一个
 4 又将剩下的桃吃一半,又多吃了一个
 5 都吃了剩下的一半又多一个
 6 到了第10天早上在吃时,却发现只剩下一个桃
 7 问!第一天共摘了多少?
 8 ‘‘‘
 9
10 def houzi(day):
11     # 如果是第十天就返回1(1个桃子)
12     if day == 10:
13         return 1
14     else:
15         return (houzi(day+1) +1) * 2
16
17
18 def houzi(day, n):
19     if day == 1:
20         return n
21     else:
22         return houzi(day-1, (n+1)*2)

原文地址:https://www.cnblogs.com/caihuajiaoshou/p/10611938.html

时间: 2024-10-09 00:34:40

递归经典问题的相关文章

递归经典题

递归思想:方法自己调用自己,使用是要避免堆栈溢出 java.lang.StackOverflowError 递归步骤: 递推:将复杂的问题,变成简单问题,最后到一个最简单的状态,此时有一个已知值(追本溯源) 回归:再从已知值,从简单状态算到复杂状态 递归优点,思想简单:递归缺点,效率低 1.斐波那契数列 斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:1.1.2.3.5.8

C 递归经典实例

1 菲波那切数列:求第N个数列的值 #include <stdio.h> long long Fib(int  n){     return (n == 1 || n == 2) ? 1 : Fib(n - 1) + Fib(n - 2); } int main(){  printf("%ld\n",Fib(40)); } C:\MinGW\project>gcc -std=c99 main.c C:\MinGW\project>a.exe 102334155

递归经典--百练4147--汉诺塔问题

直接来看代码,来体会递归~ 事实上,这个代码是最最让我体会到递归之美的~ 好美啊~好妙啊~ #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<cctype> using namespace std; #define maxn 0x3f3f3f3f int coun=0; void hanoi(int n,char a,char b,c

ybt1207 最大公约数问题 递归经典例题

ybt1207 最大公约数问题 递归典例 (选它只是因为太典型,不是因为懒得做难题故意放水) [题目描述] 给定两个正整数,求它们的最大公约数. [输入] 输入一行,包含两个正整数(<1,000,000,000). [输出] 输出一个正整数,即这两个正整数的最大公约数. [输入样例] 6 9 [输出样例] 3 [题解] 求最大公约数明明可以两个数同时试除所有小于等于它们的算术平方根的质数,然后把整除的数累乘,得到结果,但是这种算法不光写起来很麻烦,而且的复杂度是: \[ O(\sqrt{n})

power函数的非递归经典实现(时间复杂度仅仅为logn)

#include<iostream> using namespace std; template <class T,class Integer> T power(T x,Integer n) { if(n == 0) return 1; if(n == 1) return x; while((n&1) == 0) { x = x*x; n >>= 1; } T result = x; n >>= 1; while(n != 0) { x = x*x;

递归经典面试题_ 小例

主要内容如下: 1 private void button1_Click(object sender, EventArgs e) 2 { 3 //按钮事件 4 int value; 5 if(int.TryParse(textBox1.Text,out value)){ 6 label2.Text= function(value).ToString(); 7 }else{ 8 MessageBox.Show("请输入正确的数","提示:"); 9 } 10 11 }

数据结构与算法5: 递归(Recursion)

数据结构与算法5: 递归(Recursion) 写在前面 <软件随想录:程序员部落酋长Joel谈软件>一书中<学校只教java的危险性>一章提到,大学计算机系专业课有两个传统的知识点,但许多人从来都没搞懂过,那就是指针和递归.我也很遗憾没能早点熟练掌握这两个知识点.本节一些关键知识点和部分例子,都整理自教材或者网络,参考资料列在末尾.如果错误请纠正我. 思考列表: 1)什么程序具有递归解决的潜质? 2)递归还是非递归算法,怎么选择? 3)递归程序构造的一般模式 1.递归定义 首要引

Java算法之递归打破及在真实项目中的使用实例

开心一笑 刚才领导问开发:"你觉得这个项目的最大风险是什么",开发说:"加班猝死" , 气氛尴尬了一分钟!!! 提出问题 1.递归算法简单复习 2.如何实现递归算法与真实项目接口??? 3.如何打破递归算法??? 解决问题 1.首先练习下网上一些递归经典题 1 package com.hwy.test; 2 3 /** 4 * 递归函数测试 5 * Created by Ay on 2016/7/2. 6 */ 7 public class RecursionTes

《C语言及程序设计》课程主页

第1章 引言及体验 [课程视频]  [本章示例] 1.1 课程介绍--内容及学习方法 1.2 程序设计语言 自测 1.3 搭建C语言的运行平台 >>>实践:按视频指导搭建编程环境并运行程序 1.4 C语言程序初体验 >>>实践:项目要求  实践参考 1.5 分支结构程序体验 >>>实践:项目要求  实践参考 第2章 数据的表示和运算 [课程视频]  [本章示例] 2.1 数值数据类型及表示 自测 2.2 变量的使用 自测 2.3 标识符及其命名 自测