日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

递归算法题解析:设m,n均为自然数,m可表示为一些不超过n的自然数之和,f(m,n)为这种表示方式的数目

發布時間:2024/2/28 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 递归算法题解析:设m,n均为自然数,m可表示为一些不超过n的自然数之和,f(m,n)为这种表示方式的数目 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題源:中科院軟件所 1997 二,1(9分)

設m,n均為自然數,m可表示為一些不超過n的自然數之和,f(m,n)為這種表示方式的數目。

例:f(5,3)=5,有五種表示方式:

3+2
3+1+1
2+2+1
2+1+1+1
1+1+1+1+1

請補全遞歸代碼。

答案

#include<stdio.h>int f(int m, int n); int main() {int m,n,ans;scanf("%d%d",&m,&n);ans = f(m,n);printf("%d\n",ans); }int f(int m, int n) {if(m == 1)return 1;if(n == 1)return 1;if(m == n)return (1 + f(m, n-1));else if(m < n)return f(m, m)else // (m > n)return (f(m - n, n) + f(m, n - 1)); }

第一行定義了f(m,n)這個函數,返回值即表示方式的數目,為一個整數.

第二行定義了 m 和 n 這兩個自變量為整數.

if (m==1) return 1;這里是說如果m等于1,則函數的返回值為1,顯然1只能分解為1,也即表示方式只有一種.

if (n==1) return 1;這里是說如果n等于1,則函數的返回值為1,顯然無論m多大,n為1時只能表示為m個1之和,也即表示方式只有一種.

當m>n時,f(m,n) 可以遞歸地分解為兩種情況:
當最大加數包含n時,即f(m-n, n)
當最大加數不包含n時,即f(m, n-1)

以 f(6, 4) 為例

而當 m>n 時,比如 f(6,4),可以分成兩類討論:

  • 如果最大的加數為3,則按照定義共有f(6,3)種表示方法;
  • 而剩下的表示方法中必然有一個最大的加數4,由于總和為6,因此可知其余的加數之和為6-4=2,而要使小于等于4的自然數之和等于2,按照函數定義,共有f(2,4)種可能性。
  • 因此,f(6,4) = f(6,3) + f(2,4)。

總結

以上是生活随笔為你收集整理的递归算法题解析:设m,n均为自然数,m可表示为一些不超过n的自然数之和,f(m,n)为这种表示方式的数目的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。