递归算法题解析:设m,n均为自然数,m可表示为一些不超过n的自然数之和,f(m,n)为这种表示方式的数目
生活随笔
收集整理的這篇文章主要介紹了
递归算法题解析:设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)为这种表示方式的数目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于我国科技创新研究,以及创新成果的转化
- 下一篇: 数据结构:用栈实现表达式的转换(文字描述